如何在我的gem中扩展ApplicationController?

时间:2015-02-19 11:53:38

标签: ruby-on-rails ruby ruby-on-rails-4 gem

例如,我想停止所有操作的渲染布局。我可以在ApplicationController中编写这段代码及其工作:

layout :false

所以,我想创建一个添加此功能的gem。 我在我的gem的lib中尝试这个代码:

module MyLayout
  class Engine < ::Rails::Engine
  end

  class ApplicationLayoutController < ApplicationController
    layout :false
  end
end

和此:

module MyLayout
  class Engine < ::Rails::Engine
  end

  class ApplicationController < ActionController::Base
    layout :false
  end
end

但它不起作用。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您只是定义自己的ApplicationController课程。它存在于您的模块中,如下所示:MyLayout::ApplicationController。它不会影响仅使用它们的应用程序。

如果您想为gem的用户提供所需的功能,您可以选择几个选项。

“最好的”可能是提供你自己的ActionController::Base子类,并指示你的用户继承:

module MyLayout
  class Engine < ::Rails::Engine
  end

  class ApplicationLayoutController < ApplicationController
    layout :false
  end
end

# When using your gem

class MyController < MyLayout::ApplicationLayoutController
  # stuff
end

另一种方法是提供一个模块,在包含时运行layout: false

module MyLayout
  class Engine < ::Rails::Engine
  end

  module MyLayoutController
    def self.included(base)
      base.layout(:false)
    end
  end
end

# When using your gem

class MyController < ApplicationController
  include MyLayoutController
end

另一种方式,但可能不是很明智,是修补补丁ActionController::Base