簡體   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