我正在使用Rails引擎,但我需要自定义一些控制器操作。
我实际上是分叉引擎,并将这些自定义实现到我自己的fork中,但我想知道Rails Engines中是否有正式的方法来覆盖和自定义控制器。
答案 0 :(得分:19)
只需在您自己的app\controllers
文件夹中定义一个名称相同的控制器,它就会首先找到。
这样您就可以轻松自定义它。
请注意:因为首先找到它,所以从引擎中更换整个控制器。这可能正是你想要的。在某些情况下,你只想稍微调整一下,然后重新打开课程就好了,只重新定义了所需的内容。
可以在此处找到示例:http://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
答案 1 :(得分:8)
接受的答案中的链接实际上并未提供覆盖控制器的示例。他们提到文件的“开放式分类”,但没有解释如何完成它。如果在应用程序中打开引擎类,则会出现循环依赖性错误,因为您正在引用/打开当前正在定义的类。因此,您需要确保首先加载引擎的实际类。
# in my app
# app/controllers/blazer/base_controller.rb
load Blazer::Engine.root.join('app/controllers/blazer/base_controller.rb')
Blazer::BaseController.class_eval do
filter_access_to :all
end
就我而言,我正在使用Blazer gem并为其添加身份验证。由于我使用的是声明式授权,Blazer不直接支持,我需要打开Blazer的基本控制器并向其添加授权要求。