【问题标题】:Override a Rails Engine controller action覆盖 Rails 引擎控制器动作
【发布时间】:2010-05-21 09:57:17
【问题描述】:

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

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

【问题讨论】:

标签: ruby-on-rails rails-engines


【解决方案1】:

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

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

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

【讨论】:

  • 比维护自定义分叉要容易得多!感谢和抱歉这个蹩脚的问题!
  • 这将覆盖整个控制器,而不仅仅是一个动作。
  • 我没有另外声明。但至少你可以自定义它。你有更好的解决方案吗?
  • 有几种,其中这似乎是首选方法-edgeguides.rubyonrails.org/…
  • 谢谢,我相应地调整了我的答案。
【解决方案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 gem 并向其添加身份验证。由于我使用的是 Blazer 不直接支持的声明式授权,因此我需要打开 Blazer 的基本控制器并将我的授权要求添加到其中。

【讨论】:

  • 这应该是公认的答案,因为它给出了 OP 要求的示例,并使用了 rails 指南中的文档建议的格式。
  • 有效!这是最惯用的 Rails 方式吗?
  • @DavidT 我相信。我在生产引擎的宝石中看到了这一点。
猜你喜欢
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多