18

我正在使用 Rails 引擎,但我需要自定义一些控制器操作。

我实际上分叉了引擎,并将这些自定义实现到我自己的分叉中,但我想知道 Rails 引擎中是否有官方方法来覆盖和自定义控制器。

4

2 回答 2

21

只需在自己的文件夹中定义一个同名的控制器app\controllers,它就会被首先找到。这样您就可以轻松自定义它。

请注意:因为它是首先找到的,所以您从引擎中更换了整个控制器。这可能正是您想要的。在某些情况下,你只是想稍微调整一下,那么重新开课会好得多,只重新定义需要的东西。

可以在这里找到示例:http: //edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers

于 2010-05-21T10:18:27.660 回答
14

已接受答案中的链接实际上并未提供覆盖控制器的示例。他们提到“开放分类”文件,但没有解释具体如何做。如果您在应用程序中打开引擎类,您将收到循环依赖错误,因为您正在引用/打开当前正在定义的类。因此,您需要确保首先加载引擎的实际类。

# 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 的基本控制器并将我的授权要求添加到其中。

于 2017-04-28T22:26:17.450 回答