我已将gem(引擎)包含到我的应用程序中并调用了相应的安装任务...我发现某些功能(位于gem的lib /文件夹中)并非如此我非常喜欢它。
是否有可能用自己的方法覆盖(方法和部分)方法?我试图在我的应用程序的lib /文件夹(相同的目录结构)中创建相同的文件,但是,我的方法不会被调用。
编辑:
我想我的问题应该是(并且我会编辑它)...说引擎(Gem)为我提供了以下模块 - Gem :: TheirModule我可以添加相同的Gem: :他们的lib模块到我的lib文件夹(包含在application.rb中)并假设我已经定义了一个重复的方法,我的方法将被调用而不是他们的?
感谢。
答案 0 :(得分:2)
Rails不会自动要求/ lib文件夹中的文件。您需要明确要求它们。
您可以在config/application.rb
。
查看module_eval
和class_eval
方法:它们允许您更改或添加现有模块/类的功能(当然,您可以重新打开该类并在其中进行更改)。
答案 1 :(得分:1)
正如documentation on engines中所述,重新开放该类并覆盖这些方法将允许您期望您的实现接管引擎的实现。
引擎模型和控制器类可以通过开放式分类进行扩展 它们在主Rails应用程序中(因为模型和控制器类 只是继承Rails特定功能的Ruby类)。打开 对Engine类进行分类重新定义它以在主应用程序中使用。 这通常通过使用装饰器模式来实现。
对于简单的类修改,请使用
Class#class_eval
。对于复杂 类修改,请考虑使用ActiveSupport::Concern
。