Передача аргументов в фильтры - лучшие практики
Как лучше передать аргументы фильтрам в контроллерах Rails?
РЕДАКТИРОВАТЬ: фильтр имеет другое поведение в зависимости от параметров, переданных ему, или зависит от параметров, чтобы выполнить его действие. У меня есть пример в моем приложении, где фильтр определяет, как данные сортируются. Этот фильтр имеет параметр klass и вызывает klass.set_filter(param[:order]) для определения порядка в поиске.
2 ответа
Вы должны использовать для этого процедуры.
class FooController < ApplicationController
before_filter { |controller| controller.send(:generic_filter, "XYZ") },
:only => :edit
before_filter { |controller| controller.send(:generic_filter, "ABC") },
:only => :new
private
def generic_filter type
end
end
редактировать
Еще один способ передать параметр - переопределить call
метод ActionController::Filters::BeforeFilter
,
class ActionController::Filters::BeforeFilter
def call(controller, &block)
super controller, *(options[:para] || []), block
if controller.__send__(:performed?)
controller.__send__(:halt_filter_chain, method, :rendered_or_redirected)
end
end
end
Теперь вы можете изменить свою спецификацию before_filter следующим образом
class FooController < ApplicationController
# calls the generic_filter with param1= "foo"
before_filter :generic_filter, :para => "foo", :only => :new
# calls the generic_filter with param1= "foo" and param2="tan"
before_filter :generic_filter, :para => ["foo", "tan"], , :only => :edit
private
def generic_filter para1, para2="bar"
end
end
Я думаю, вы ищете использование последовательных фильтров named_scope, но я не уверен. Нам нужно больше информации, если это не то, что вам нужно.