有什么更好的方法可以将参数传递给 Rails 控制器中的过滤器?
编辑:过滤器具有不同的行为,具体取决于传递给它的参数,或者取决于执行其操作的参数。我的应用程序中有一个示例,其中过滤器确定数据的排序方式。这个过滤器有一个 klass 参数并调用 klass.set_filter(param[:order]) 来确定搜索中的 :order。
有什么更好的方法可以将参数传递给 Rails 控制器中的过滤器?
编辑:过滤器具有不同的行为,具体取决于传递给它的参数,或者取决于执行其操作的参数。我的应用程序中有一个示例,其中过滤器确定数据的排序方式。这个过滤器有一个 klass 参数并调用 klass.set_filter(param[:order]) 来确定搜索中的 :order。
为此,您必须使用 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
我认为您正在寻找使用连续的 named_scope 过滤器,但我不确定。如果这不是您需要的,我们需要更多信息。