Dans un accès d'originalité, j'écris une application de blog en utilisant Ruby on Rails. Mon PostsController
contient du code qui garantit que l'utilisateur connecté peut uniquement modifier ou supprimer ses propres messages.Rails: Garder les contrôles d'usurpation d'utilisateur DRY
J'ai essayé de factoriser ce code dans une méthode privée avec un seul argument pour le message flash à afficher, mais quand je l'ai fait et testé en éditant le post d'un autre auteur, j'ai un ActionController::DoubleRenderError
- "Peut seulement rendre ou rediriger une fois par action ".
Comment puis-je conserver ces vérifications DRY? L'approche évidente consiste à utiliser un filtre avant, mais la méthode destroy
doit afficher un flash différent.
Voici le code du contrôleur concerné:
before_filter :find_post_by_slug!, :only => [:edit, :show]
def edit
# FIXME Refactor this into a separate method
if @post.user != current_user
flash[:notice] = "You cannot edit another author’s posts."
redirect_to root_path and return
end
...
end
def update
@post = Post.find(params[:id])
# FIXME Refactor this into a separate method
if @post.user != current_user
flash[:notice] = "You cannot edit another author’s posts."
redirect_to root_path and return
end
...
end
def destroy
@post = Post.find_by_slug(params[:slug])
# FIXME Refactor this into a separate method
if @post.user != current_user
flash[:notice] = "You cannot delete another author’s posts."
redirect_to root_path and return
end
...
end
private
def find_post_by_slug!
slug = params[:slug]
@post = Post.find_by_slug(slug) if slug
raise ActiveRecord::RecordNotFound if @post.nil?
end
Ne faites pas de requête avant la vérification d'authentification! –
@Pedro Vous allez devoir m'expliquer comment vous pouvez vérifier l'autorisation (pas l'authentification) en fonction d'un modèle spécifique avant d'avoir une copie de ce modèle. :) –
Votre méthode d'autorisation fait 0 requêtes. Vous effectuez une recherche avant de vérifier si l'utilisateur est autorisé ou non. –