【问题标题】: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。