2010-02-24 95 views
2

有什麼更好的方法將參數傳遞給Rails控制器中的過濾器?將參數傳遞給過濾器 - 最佳實踐

編輯:根據傳遞給它的參數或取決於執行其操作的參數,過濾器具有不同的行爲。 我在我的應用程序中有一個示例,其中一個篩選器確定數據如何排序。此過濾器具有klass參數,並調用klass.set_filter(param [:order])來確定:搜索中的順序。

回答

3

你必須爲此使用特效。傳遞參數

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 

編輯

還有一個方法是重寫的ActionController::Filters::BeforeFiltercall方法。

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 

現在你可以按照如下

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 2010-02-24 22:33:23

+1

我編輯了答案來添加另一個場景。看一看。 – 2010-02-25 01:57:28

+0

謝謝kandada,這看起來好多了= D – nanda 2010-02-25 11:39:25

0

I -think-您正在尋找使用連續的named_scope過濾器,但我不確定。我們需要更多信息,如果這不是你需要的。

+0

不,問題不在於模型或範圍的車型改變你的before_filter規範。 – nanda 2010-02-24 18:28:18

相關問題