Ruby on rails 4 Rails引擎:控制器继承和路由

Ruby on rails 4 Rails引擎:控制器继承和路由,ruby-on-rails-4,inheritance,routing,decorator,rails-engines,Ruby On Rails 4,Inheritance,Routing,Decorator,Rails Engines,我有一个引擎,在我的主应用程序中,我的控制器继承了一些引擎的控制器 class UsersController < MyEngine::UsersController end 装饰师呢 MyEngine::MyController.class_eval do end 但是super是不可能的 解决方案是在我的引擎中创建一个子控制器,并在其上使用decorator,但这似乎很奇怪…我更喜欢将此gem用于decorators,而不是require\u依赖项: 使用此gem或您的requ

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

class UsersController < MyEngine::UsersController

end
装饰师呢

MyEngine::MyController.class_eval do
end
但是
super
是不可能的


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

我更喜欢将此gem用于decorators,而不是require\u依赖项:

使用此gem或您的require_依赖项,您可以使用:

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

我更喜欢将此gem用于decorators,而不是require_依赖项:

使用此gem或您的require_依赖项,您可以使用:

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

有两种方法可以实现这一点。1.只需覆盖发动机本身的控制器。2.你可以看看
class\u eval
,它将使用“decorator”控制器中的附加逻辑重新评估你的控制器。是的,我使用的是第一种方法,但是路由使用父控制器,因此如何强制它们使用子控制器(无需重写)。你实际上没有从引擎重写控制器。您只是将其子类化,这意味着它是一个完全不同的控制器,具有与MyEngine::UsersController相同的行为。要覆盖创建此文件,请执行以下操作:
app/controllers/my\u engine/users\u controller.rb
在此文件中,确保您的类定义位于名为
MyEngine
的模块中,这将完全覆盖控制器。我认为你最好和最安全的选择是与控制器装饰师合作。因为在完全重写时,您将丢失所有逻辑。或者重写你的路由,没有其他可能的方法。好的,事实上我不想重写,这就是我使用继承的原因。所以我尝试使用decorator模式,并告诉你它是否可以。decorator模式应该可以。只要使用相同的方法名并调用
super
一切都会好起来:数据有两种方法可以实现这一点。1.只需覆盖发动机本身的控制器。2.你可以看看
class\u eval
,它将使用“decorator”控制器中的附加逻辑重新评估你的控制器。是的,我使用的是第一种方法,但是路由使用父控制器,因此如何强制它们使用子控制器(无需重写)。你实际上没有从引擎重写控制器。您只是将其子类化,这意味着它是一个完全不同的控制器,具有与MyEngine::UsersController相同的行为。要覆盖创建此文件,请执行以下操作:
app/controllers/my\u engine/users\u controller.rb
在此文件中,确保您的类定义位于名为
MyEngine
的模块中,这将完全覆盖控制器。我认为你最好和最安全的选择是与控制器装饰师合作。因为在完全重写时,您将丢失所有逻辑。或者重写你的路由,没有其他可能的方法。好的,事实上我不想重写,这就是我使用继承的原因。所以我尝试使用decorator模式,并告诉你它是否可以。decorator模式应该可以。只需使用相同的方法名称并调用
super
一切都会好起来:谢谢你,太完美了!谢谢,太完美了!