繁体   English   中英

Monailsypatch跨越Rails中的引擎

[英]Monkeypatch across Engines in Rails

首先:是的,猴子补丁很糟糕,我感觉自己已经是个罪人了。 但在这种情况下,我还没有找到另一种解决方案。

情况:

引擎1(Alchemy-CMS):提供包含多个元素的页面模型。

引擎2(我的Alchemy-Contentable):应该提供一种方法将这些元素绑定到您喜欢的任何资源(= model)。

目的是为资源提供像Alchemy这样的cms功能,这意味着添加标题,段落,图片,视频等元素......

在“页面层”一切都很好。 我为一个模型创建了一个mixin,它标识了自己对元素的满足感。

我希望尽可能地保持炼金术,因此继承元素不是一个选项(新的数据库表,新的相关模型......)。 所以猴子补丁在这里似乎已经足够了(仍然是hacky,但这次我猜它很好)。

问题:

如何从另一个引擎成功修补一个引擎的类? 当我试图像往常一样重新开课时,它抱怨不要找到常数。 可能这是由于类的延迟加载。

有效的是:

config.after_initialize do
  Alchemy::Admin::ElementsController.send(:include, AlchemyContentable::ElementsControllerMixin)
  Alchemy::Admin::ElementsController.send(:before_filter, :load_contentable_to_page, :only => [:index, :new, :create])
end

但这似乎很容易出错,特别是在从mixin访问新定义的消息时(比如app_mixin中的Alchemy :: Element.my_new_method,它包含在你的app的模型中)

以前有人有这种情况吗? 有什么方法吗? 至少是一种'可靠'的方法来创建和覆盖引擎类中的某些方法并在mixin中调用它们?

解决方案是以下列方式对Alchemy :: Page模型进行修补:

require File.expand_path('../../app/models/alchemy/page', Alchemy::Engine.called_from)

module Alchemy

  class Page < BaseRecord

    # Your code goes here...

  end
end

请注意require语句,该语句将确保原始类被扩展而不会被文件覆盖。

有关更多上下文,请参阅此博客文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM