我正在使用 Rails 引擎,但我需要自定义一些控制器操作。
我实际上分叉了引擎,并将这些自定义实现到我自己的分叉中,但我想知道 Rails 引擎中是否有官方方法来覆盖和自定义控制器。
我正在使用 Rails 引擎,但我需要自定义一些控制器操作。
我实际上分叉了引擎,并将这些自定义实现到我自己的分叉中,但我想知道 Rails 引擎中是否有官方方法来覆盖和自定义控制器。
只需在自己的文件夹中定义一个同名的控制器app\controllers
,它就会被首先找到。这样您就可以轻松自定义它。
请注意:因为它是首先找到的,所以您从引擎中更换了整个控制器。这可能正是您想要的。在某些情况下,你只是想稍微调整一下,那么重新开课会好得多,只重新定义需要的东西。
可以在这里找到示例:http: //edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
已接受答案中的链接实际上并未提供覆盖控制器的示例。他们提到“开放分类”文件,但没有解释具体如何做。如果您在应用程序中打开引擎类,您将收到循环依赖错误,因为您正在引用/打开当前正在定义的类。因此,您需要确保首先加载引擎的实际类。
# 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 的基本控制器并将我的授权要求添加到其中。