Je fais une application rails où l'utilisateur peut coller un lien soundcloud dans un champ de saisie. Ensuite, ce lien est envoyé à l'action de création dans mon post_controller
et utilisé pour obtenir le fichier JSON pour cette chanson.Rails: Valider les paramètres avant qu'ils ne soient gérés dans le contrôleur?
# app/controllers/post_controller.rb
def create
require 'open-uri'
raw_link = params[:post][:link]
raw_link.downcase.include? "soundcloud.com/"
tmp_media_json = JSON.load(open("http://soundcloud.com/oembed?format=json&url=#{raw_link}"))
if tmp_media_json['thumbnail_url']["placeholder"]
tmp_media_json['thumbnail_url'] = JSON.load(open("http://soundcloud.com/oembed?format=json&url=#{tmp_media_json['author_url']}"))['thumbnail_url']
end
media_thumbnail = tmp_media_json['thumbnail_url'].gsub('t500x500.jpg', 't80x80.jpg')
media_title = tmp_media_json['title']
media_iframe = tmp_media_json['html']
media_type = params[:post][:media_type]
@post = Post.new(link: media_iframe, title: media_title, thumbnail: media_thumbnail, media_type: media_type)
respond_to do |format|
if @post.save
format.js { render :file => "/pages/create_new_post.js.erb" }
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render action: 'show', status: :created, location: @post }
else
format.html { render action: 'new' }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
Dans le modèle Post
, je suis en train de courir validates :link, presence: true
, mais le problème est qu'il semble être fait après tout le code dans l'action create. Je veux que la validation soit faite avant tout le code dans l'action create. (Puisque s'il n'y a pas de lien valide, le code de l'action create ne fonctionnera pas).
Comment puis-je faire cela ou existe-t-il une meilleure pratique?
Cocher cette url :) [http://coverhound.com/blog/post/better-conditional-validations-in-rails] –