2013-05-01 46 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 
相关问题