2016-03-15 60 views
1

我有幾個控制器:的Rails:乾涸before_action

class First < ApplicationController 
    before_action: do_this 
    before_action: do_this_too 
end 

class Second < ApplicationController 
    before_action: do_this 
    before_action: do_this_too 
end 

class Third < ApplicationController 

end 

控制器的兩個具有相同的before_action的方法。我該如何幹這個代碼,以便FirstSecond課程在一個地方使用before_action,但不使用Third課程?

我正在考慮某種類繼承解決方案。有任何想法嗎?在我的真實世界的例子中,我有更多的類與多個相同before_actions每個?

+0

您可以創建定義這些'before_action模塊'回調並在需要它的每個控制器中包含此模塊,或者使用繼承並創建父控制器 – MrYoshiji

+0

我會不會在before_action中獲取未定義的方法?行動之前不是一個類方法嗎?如果不是,我把它放在哪裏? –

+1

你可以在這裏找到一個例子:http://stackoverflow.com/questions/27867124/how-to-use-before-action-in-a-module – MrYoshiji

回答

3

我相信最好保持它的樣子。如果你將這些before_action移動到一個模塊或類似的東西,它會讓你的控制器更難以閱讀和理解發生了什麼。

換句話說,你會幹掉你的控制器,但也會違反KISS原則(保持簡單)。

但是如果你無論如何要做到這一點,方法如下:

module SharedBeforeActions 
    def self.included(base) 
    base.before_action :do_this 
    end 

    def do_this 
    # Your filter definition here 
    end 
end 

class Third < ApplicationController 
    include SharedBeforeActions 
end 

最後你就必須配置的Rails來加載模塊:

# config/application.rb 
config.autoload_paths += %W(#{config.root}/lib) 
+1

您在答案的文本中提到了它,但沒有提到代碼。我相信'before_action'是現在的首選方法。 – yez

+0

謝謝@yez,我忘了改變它 – akz92