【发布时间】: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