Передача аргументов в фильтры - лучшие практики - PullRequest
2 голосов
/ 24 февраля 2010

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

РЕДАКТИРОВАТЬ: Фильтр имеет другое поведение в зависимости от параметров, переданных ему, или зависит от параметров, чтобы выполнить его действие. У меня есть пример в моем приложении, где фильтр определяет, как данные сортируются. Этот фильтр имеет параметр klass и вызывает klass.set_filter (param [: order]) для определения: порядка в поиске.

Ответы [ 2 ]

3 голосов
/ 24 февраля 2010

Вы должны использовать для этого процы.

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
0 голосов
/ 24 февраля 2010

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

...