2010-02-24 3 views
2

Какие еще способы передать аргументы фильтрам в контроллерах Rails?Передача аргументов фильтрам - лучшие практики

EDIT: Фильтр имеет другое поведение в зависимости от переданных ему параметров или зависит от параметров для выполнения его действий. У меня есть пример в моем приложении, где фильтр определяет, как сортируются данные. Этот фильтр имеет параметр klass и вызывает klass.set_filter (param [: order]), чтобы определить: порядок в поиске.

ответ

3

Для этого вы должны использовать procs.

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 
+1

Я знаю. Я просто хочу знать, есть ли другие (и более сложные, более смысловые) способы сделать это. – nanda

+1

Я отредактировал ответ, чтобы добавить еще один сценарий. Взглянуть. –

+0

Спасибо Kandada, это выглядит намного лучше = D – nanda

0

I -think- вы ищете использование последовательных фильтров named_scope, но я не уверен. Нам нужна дополнительная информация, если это не то, что вам нужно.

+0

Нет, речь идет не о моделях или областей для моделей. – nanda