before_filter с параметрами - PullRequest
       5

before_filter с параметрами

80 голосов
/ 01 апреля 2011

У меня есть метод, который делает что-то вроде этого:

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

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

Я также хочу использовать этот метод в некоторых других контроллерах, поэтому я скопировал метод в помощник, который включен в application_controller.

проблема в том, что в некоторых контроллерах id для проекта - это не символ :id, а f.e. :project_id (а также присутствует :id (для другой модели)

Как бы вы решили эту проблему? есть ли возможность добавить параметр в действие before_filter (для передачи правильного параметра)?

Ответы [ 5 ]

81 голосов
/ 01 апреля 2011

Я бы сделал это так:

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 - соответствующий идентификатор для доступа к Project.

61 голосов
/ 13 декабря 2013

С некоторым синтаксическим сахаром:

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

Или, если вы решите стать еще более необычным:

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

А начиная с Rails 4 before_action, синоним к before_filter, был введен, поэтому он может быть записан как:

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

NB

-> означает lambda, называемый лямбда-литерал , введите в Ruby 1.9

%i создаст массив символов

14 голосов
/ 01 октября 2013

Чтобы продолжить ответ @alex ', если вы хотите :except или :only некоторыми методами, вот синтаксис:

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

Найдено здесь .

5 голосов
/ 18 мая 2016

Я считаю, что блочный метод с использованием фигурных скобок вместо do...end является наиболее ясным вариантом

before_action(only: [:show]) { authenticate_rights(id) }

before_action - это просто более новый предпочтительный синтаксис для before_filter

0 голосов
/ 01 апреля 2011

Это должно работать:

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

Это должно вернуть params[:project_id], если оно присутствует в хэше params, или вернуть params[:id], если его нет.

...