【问题标题】:Rails engines : Controller inheritance and routesRails 引擎:控制器继​​承和路由
【发布时间】:2015-09-27 19:19:01
【问题描述】:

我有一个引擎,在我的主应用程序中,我的控制器继承了一些引擎的控制器。

class UsersController < MyEngine::UsersController

end

如何强制我的引擎使用子控制器,而不必在我的主应用程序中重新创建我的所有路线?

---- 带装饰器(JensD 的解决方案):

我已添加到我的 engine.rb 文件中

config.to_prepare do
  Dir.glob(Rails.root + "app/decorators/**/my_engine/*_decorator*.rb").each do |c|
    require_dependency(c)
  end
end

和装饰器

MyEngine::MyController.class_eval do
end

但是super是不可能的...

一种解决方案是在我的引擎中创建一个子控制器并在其上使用装饰器,但这似乎很奇怪......

【问题讨论】:

  • 有两种方法可以做到这一点。 1.只需覆盖引擎本身的控制器。 2. 您可以查看class_eval,它将使用“装饰器”控制器内的附加逻辑重新评估您的控制器。
  • 是的,我使用的是第一种方式,但是路由使用父控制器,那么如何强制它们使用子控制器(无需重写)。
  • 您实际上并没有从引擎中覆盖控制器。您只是对其进行子类化,这意味着它是一个完全不同的控制器,具有与MyEngine::UsersController 相同的行为。要覆盖创建此文件:app/controllers/my_engine/users_controller.rb 在此文件中,确保您的类定义位于名为 MyEngine 的模块内,这将完全覆盖控制器。我认为您最好和最安全的选择是使用控制器装饰器。因为完全覆盖时您将失去所有逻辑。或以其他方式重写您的路线。
  • 好吧,其实我不想重写,这就是我使用继承的原因。所以我尝试使用装饰器模式并告诉你是否可以。
  • 装饰器模式应该没问题。只需使用相同的方法名称并调用super 一切都会好的:D

标签: ruby-on-rails-4 inheritance routing decorator rails-engines


【解决方案1】:

我更喜欢将这个 gem 用于装饰器而不是 require_dependency:

https://github.com/EPI-USE-Labs/activesupport-decorators

有了这个 gem 或者你的 require_dependency 你可以使用:

alias_method :super_index, :index
def index
  ...
  super_index
end

【讨论】:

  • 谢谢,太完美了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多