web-dev-qa-db-fra.com

before_filter avec paramètres

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)?

80
choise

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

correct_id_here est l'identifiant approprié pour accéder à un Project.

81
Alex

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

63
Vadym Tyemirov

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 .

14

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

5
Subtletree