2013-05-01 42 views
1

在我的Rails應用程序中,我安裝了一個外部引擎。我在ApplicationController中有一個before_filter,我需要從此過濾器中排除引擎的一些操作。使用before_filter,是否可以排除掛載引擎的操作?

通常,我會在相應的控制器中使用skip_before_filter,但由於它不是我的,我寧願不要觸摸引擎代碼本身。

有沒有辦法做到這一點?

class ApplicationController < ActionController::Base 

    before_filter :authorize, :except => [:engine/setup] # something like this? 
    ... 

感謝,

PJ

回答

2

只是從自己的一個新的控制器繼承你想要的發動機控制器,然後覆蓋您要過濾器之前跳過的行動,只是calll 超級在裏面。在該控制器中,使用動作名稱(也是父引擎控制器動作的名稱)調用skip_before_filter。

class MyController < EngineController 
    skip_before_filter :authorize, :only => [:setup] 

    def setup 
     super 
    end 
end 

不完全確定,但我認爲這將做到這一點。

+0

非常感謝,對不起,我花了這麼長時間......這不是我們的選擇:這個引擎有很多控制器(<> 30)。我們需要這麼做很多次。所以我沒有嘗試。但無論如何,我不確定這是否會說實話:當我們加載一個指向引擎的URL時,Rails將如何知道直接「請求」這些新控制器而不是原來的引擎? – PJC 2013-05-14 11:38:51

+0

因爲你的app目錄中的控制器在某處路由時具有優先權。 – Raindal 2013-05-14 13:16:09

1

嘗試添加下列到一個初始化 - 例如:config/initializers/engine.rb

EngineController.class_eval do 
    skip_before_filter :authorize, :only => [:setup] 
end 
2

只需添加到廣州澳凌的答​​案,你需要在發動機內指定特定的控制器,或者只是ApplicationController

EngineController::ApplicationController.class_eval do 
    skip_before_filter :authorize, :only => [:setup] 
end 

另外,如果您希望在開發模式下的每個請求上重新加載篩選器跳過:

Rails.application.config.to_prepare do 
    EngineController::ApplicationController.class_eval do 
    skip_before_filter :authorize, :only => [:setup] 
    end 
end 
相關問題