J'ai une méthode qui fait quelque chose comme ça:
before_filter :authenticate_rights, :only => [:show]
def authenticate_rights
project = Project.find(params[:id])
redirect_to signin_path unless project.hidden
end
Je veux également utiliser cette méthode dans certains autres contrôleurs, j'ai donc copié la méthode dans un assistant inclus dans l'application_controller.
le problème est que, dans certains contrôleurs, l'ID du projet n'est pas le :id
symbole mais f.e. :project_id
(et aussi un :id
est présent (pour un autre modèle)
Comment résoudrais-tu ce problème? existe-t-il une option pour ajouter un paramètre à l'action before_filter (pour passer le bon paramètre)?
Je le ferais comme ça:
before_filter { |c| c.authenticate_rights correct_id_here }
def authenticate_rights(project_id)
project = Project.find(project_id)
redirect_to signin_path unless project.hidden
end
Où correct_id_here
est l'identifiant approprié pour accéder à un Project
.
Avec du sucre syntaxique:
before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]
Ou si vous décidez de devenir encore plus chic:
before_filter ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|
Et puisque Rails 4 before_action
, synonyme de before_filter
, a été introduit, il peut donc s'écrire:
before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|
NB
->
signifie lambda
, appelé lambda littéral , introduit dans Ruby 1.9
%i
créera un tableau de symboles
Pour continuer la réponse de @alex, si vous voulez :except
ou :only
quelques méthodes, voici la syntaxe:
before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end
Trouvé ici .
Je trouve la méthode de bloc en utilisant des accolades au lieu de do...end
pour être l'option la plus claire
before_action(only: [:show]) { authenticate_rights(id) }
before_action
n'est que la syntaxe préférée la plus récente pour before_filter