2010-05-21 88 views
13

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

我其实分叉引擎,并将这些自定义项实现到我自己的fork中,但我想知道是否有一种Rails引擎中的官方方式来覆盖和自定义控制器。

+0

看看那里http://stackoverflow.com/questions/5045068/extending-controllers-of-a-rails-3-engine-in-the-main-app – Andrei 2011-02-19 14:36:16

回答

18

只需在您自己的app\controllers文件夹中定义一个具有相同名称的控制器,即可首先找到它。 这样你可以轻松地定制它。

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

例子做的就是可以在这里找到:http://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers

+0

比维护定制叉更容易! 感谢和抱歉的跛脚问题! – 2010-05-21 10:40:15

+0

这将覆盖整个控制器,而不仅仅是一个动作。 – 2013-01-31 20:40:53

+0

我没有另外声明。但至少你可以自定义它。你有更好的解决方案吗? – nathanvda 2013-02-01 19:04:33

2

在接受答案的链接实际上并没有提供一个例子来重写控制器。他们提到了“公开分类”文件,但并没有解释如何正确地做到这一点。如果您在应用程序中打开引擎类,则会因为引用/打开当前正在定义的类而导致出现循环依赖关系错误。因此,您需要确保先加载引擎的实际类。

# 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宝石和增加验证它。由于我使用声明式授权,Blazer不直接支持,所以我需要打开Blazer的基本控制器,并向其添加授权要求。

+1

这应该是可以接受的答案,因为它给出了OP要求的示例以及轨道指南中的文档格式。 – dft 2017-10-25 20:18:23