簡體   English   中英

裝飾 Rails 引擎的助手以包含來自主應用程序的關注

[英]Decorate a Rails engine's helper to include a concern from the main app

我想通過裝飾引擎的幫助程序模塊之一,在引擎中包含來自應用程序的 ActiveSupport::Concern。 這是來自引擎的 Helper:

module MyEngine
  module MyHelper
  end
end

這是主應用程序的關注點:

module MyConcern
  extend ActiveSupport::Concern

  def do_this
  end

  def do_that
  end
end

下面是需要包含關注點的裝飾引擎助手(用於引擎視圖) - 它在主應用程序中聲明,使用Rails 指南中描述的裝飾器模式:

module MyEngine
  module MyHelper
    include MyConcern

    def do_stuff
    end
  end
end

修飾的幫助器由引擎正確加載,但引擎視圖只能調用“do_stuff”。 MyConcern 的方法不可用,我很難弄清楚原因。 我還嘗試通過將其嵌入 MyEngine::MyHelper.module_eval 調用來包含該問題,但這也不起作用。

有沒有人遇到過這種問題? 我是否以錯誤的方式看待這個問題?

我將 MyHelper 從模塊替換為類

module MyConcern
  extend ActiveSupport::Concern

  def do_this
    "do this"
  end

  def do_that
    "do that"
  end
end

module MyEngine
  class MyHelper
    include ::MyConcern

    def do_stuff
      "do stuff"
    end
  end
end

打電話時:

MyEngine::MyHelper.new.do_stuff
MyEngine::MyHelper.new.do_this
MyEngine::MyHelper.new.do_that

結果將是:

做東西

做這個

去做

我想你可能在反推這個。

如果您的引擎提供:

module MyEngine
  module MyHelper
    def foo
    end
  end
end

您可以在主應用程序中擴展該方法(您可以將其稱為裝飾,但我不確定這在技術上是否是裝飾器模式):

module MainApp
  module MyHelper
    extend ::MyEngine::MyHelper
    def foo
      super
      do_something_else
    end
  end
end

當使用模塊混合模式(這是 ActiveSupport::Concern 所做的)時,您可以使用模塊擴展模塊並將模塊包含在類中。

如果您的引擎和主應用程序“共享部分” - 它應該只是放置在引擎中,因為 Rails 將在應用程序的 app/views 目錄中渲染時首先查找視圖,然后再查找已安裝的引擎。

因此,主應用程序可以始終覆蓋引擎提供的功能,而反之則不然。

如果您想讓引擎提供的方法可配置,更好的主意是使用 Rails 配置設置(或單獨的模塊配置)或僅使用方法參數,而不是一些瘋狂的循環依賴馬戲團。

所以我終於找到了一種以“干凈”的方式做到這一點的方法,如以下評論中所述: https : //groups.google.com/g/rubyonrails-core/c/PaABJDXnxyo/m/k-QUJEi9a9wJ

這個想法是在引擎中添加一個空的占位符助手,例如:

module MyEngine
  module ExtendableHelper
  end
end

然后在主應用程序中覆蓋它,通過添加方法或包含關注點、其他 gem 的助手等...

module MyEngine
  module ExtendableHelper
    extend OtherGemFromMainApp::UsefulHelper
    include MainAppConcern
    
    def other_useful_method
      ...
    end
  end
end

因此引擎使用的助手是應用程序提供的助手,可以在引擎視圖中調用UsefulHelper方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM