Before_filter с параметрами
У меня есть метод, который делает что-то вроде этого:
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
, но f.e. :project_id
(а также a :id
присутствует (для другой модели)
Как бы вы решили эту проблему? есть ли опция добавить параметр к действию before_filter (чтобы передать правильный параметр)?
Ответы
Ответ 1
Я бы сделал это вот так:
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
.
Ответ 2
С синтаксическим сахаром:
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
создаст массив символов
Ответ 3
Чтобы продолжить @alex 'ответ, если вы хотите :except
или :only
некоторые методы, вот синтаксис:
before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end
Найдено здесь.
Ответ 4
Я обнаружил, что блок-метод с использованием фигурных скобок вместо do...end
является самым ясным вариантом
before_action(only: [:show]) { authenticate_rights(id) }
before_action
- это только более новый предпочтительный синтаксис для before_filter
Ответ 5
Это должно работать:
project = Project.find(params[:project_id] || params[:id])
Это должно возвращать params[:project_id]
, если оно присутствует в хэше params, или возвращать params[:id]
, если это не так.