У меня есть метод, который делает что-то вроде этого:
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
символом, а является fe :project_id
(а также :id
присутствует (для другой модели)
Как бы вы решили эту проблему? есть ли возможность добавить параметр к действию before_filter (чтобы передать правильный параметр)?
,:only => [:show]
символ? Я получаю ошибку , пытаясьbefore_filter { |c| c.authenticate_rights correct_id_here }, :only => [:show]
before_filter(:only => [:show]) { <block_code_here> }
. Больше примеров здесь: apidock.com/rails/ActionController/Filters/ClassMethods/…before_filter
частный метод, то, возможно, повторно фактор (например, переместите его в родительский контроллер, ApplicationController и т. Д.), Вам нужно будет использовать,c.send(:filter_name, ...)
поскольку фильтр не будет работать в контексте контроллера. guides.rubyonrails.org/…С некоторым синтаксическим сахаром:
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|
А так как был представлен
before_action
синоним Rails 4 ,before_filter
его можно записать как:before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|
NB
->
означаетlambda
, называемый лямбда-литералом , введенный в Ruby 1.9%i
создаст массив символовисточник
find_campaign
приватного метода? Вparam=params[:id]
, этоparam
имя новой локальной переменной, которая будет передана в качестве аргументаfind_campaign
? Это означает, что внутри самогоfind_campaign
частного метода мы используемparam
notparams{:id]
,?find_campaign
может быть любым, но я бы сделал его закрытым, чтобы убедиться, что мы не раскрываем то, что не потребляется.params
- это хеш-переменная, доступная для наших методов,param
это любая переменная, которую вам нужно передать методу find_campaign, напримерbefore_action ->(campaign_id=params[:id]) { find_campaign(campaign_id) }, only: %i| show edit update destroy |
Чтобы продолжить ответ @alex, если вы хотите
:except
или:only
некоторые методы, вот синтаксис:before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end
Нашел здесь .
источник
Я считаю, что блочный метод использует фигурные скобки вместо того,
do...end
чтобы быть самым ясным вариантомbefore_action(only: [:show]) { authenticate_rights(id) }
before_action
это просто новый предпочтительный синтаксис дляbefore_filter
источник
Это должно работать:
project = Project.find(params[:project_id] || params[:id])
Он должен возвращаться,
params[:project_id]
если он присутствует в хэше params, или возвращаться,params[:id]
если его нет.источник
project_id
присутствует, тоor
предложение гарантирует, что это используется - параметр будет выбран только в том случае, еслиproject_id
не указанid
. Другими словами: когда указаны оба параметра,or
предложение гарантирует, что используется правильное значение, что всегда будет предпочтительнееproject_id
. Естественно, вы не захотите вызывать этот метод, когда ни один из них не присутствует, или когда нет,project_id
но есть,id
который не ссылается на проект.