80 votes

before_filter avec des paramètres

j'ai une méthode qui fait quelque chose comme ceci:

    before_filter :authenticate_rights, :only => [:show]

    def authenticate_rights
      project = Project.find(params[:id])
      redirect_to signin_path unless project.hidden
    end

je tiens également à utiliser cette méthode dans d'autres Contrôleurs, j'ai donc copié la méthode à un helper qui est inclus dans le application_controller.

le problème, c'est que dans certains contrôleurs, l'id du projet n'est pas l' :id symbole mais f.e. :project_id (et aussi un :id (pour un autre modèle)

comment voulez-vous résoudre ce problème? est-il une option pour ajouter un paramètre à la before_filter action (pour passer le droit param)?

merci pour tous les conseils

81voto

Alex Points 21247

Je ferais comme ceci:

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'id de l'accès d'un Projet.

64voto

Vadym Tyemirov Points 918

Avec certaines sucre syntaxique:

before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]

Ou si vous décidez d'obtenir encore plus de fantaisie:

before_filter ->(param=params[:id]) { find_campaign param }, only: %w{show edit update destroy}

Et depuis Rails 4 before_action, synonyme d' before_filter, a été introduit, de sorte qu'il peut être écrite comme:

before_action ->(param=params[:id]) { find_campaign param }, only: %w{show edit update destroy}

NB

-> représente lambda, appelé lambda littérale, d'introduire dans Ruby 1.9

14voto

Augustin Riedinger Points 1600

Pour continuer @alex " réponse, si vous souhaitez :except ou :only certaines méthodes, voici la syntaxe:

before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end 

Trouvé ici.

-1voto

Matheus Moreira Points 7839

Cela devrait fonctionner:

project = Project.find(params[:project_id] || params[:id])

Cela devrait renvoyer params[:project_id] si elle est présente dans les params de hachage, ou retournez - params[:id] si elle n'est pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X