使用before_filter,是否可以排除已安装的引擎的操作?

时间:2013-05-01 16:56:03

标签: ruby-on-rails ruby-on-rails-3

在我的Rails应用程序中,我正在安装一个外部引擎。我的before_filter中有一个ApplicationController,我需要从此过滤器中排除某些引擎的操作。

通常,我会在相应的控制器中使用skip_before_filter,但我宁愿不触及引擎代码本身,因为它不是我的。

有办法做到这一点吗?

class ApplicationController < ActionController::Base

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

谢谢,

PJ

3 个答案:

答案 0 :(得分:3)

只是要添加到orien的答案,您需要在引擎中指定特定的控制器,或者仅指定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

答案 1 :(得分:2)

只需从您自己的新控制器继承您想要的引擎控制器,然后覆盖您要跳过前过滤器的操作,并在其中调用 super 。在该控制器中,使用您的操作名称(也是父引擎控制器操作的名称)调用skip_before_filter。

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

    def setup
        super
    end
end

不完全确定,但我认为这样可以解决问题。

答案 2 :(得分:1)

尝试将以下内容添加到初始值设定项中 - 例如config/initializers/engine.rb

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