【问题标题】:How to extend ApplicationController in my gem?如何在我的 gem 中扩展 ApplicationController?
【发布时间】:2015-02-19 11:53:38
【问题描述】:

例如,我想停止所有操作的渲染布局。我可以在 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

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

【问题讨论】:

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


【解决方案1】:

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

如果您想为您的 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

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2015-03-25
    • 2013-03-09
    相关资源
    最近更新 更多