簡體   English   中英

在覆蓋Rails引擎視圖/布局時訪問主應用程序助手

[英]Access Main App Helpers when overridings a Rails Engine View/Layout

我創建了一個簡單的Rails引擎,為應用程序提供一些通用功能(照片庫)。 我希望能夠覆蓋標准_header部分,以便庫的菜單與我的主應用程序的菜單匹配。 在我的標題視圖中,我調用了一個幫助程序,它是application_helpers(主應用程序)的一部分,但我不斷收到“未定義的方法”錯誤。 據我所知,當我覆蓋引擎應用程序布局或其部分時,主應用程序application_helpers沒有被包括(顯然)。

所以我的問題是,如何覆蓋主應用程序中的引擎視圖,並獲得對主應用程序幫助程序方法的訪問權限? 我仍然需要訪問引擎助手,而不是搞砸引擎功能。

我是否還需要覆蓋控制器? 得到一些幫助似乎很多。

謝謝

Rails 3.1.3

看看這篇博文: http//www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/作者將一個method_missing定義添加到應用程序幫助器中以便訪問父應用程序的幫助程序。

/config/initializers/blogit.rb

module Blogit
    module ApplicationHelper
      def method_missing method, *args, &block
        puts "LOOKING FOR ROUTES #{method}"
        if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
          if main_app.respond_to?(method)
            main_app.send(method, *args)
          else
            super
          end
        else
          super
        end
      end

      def respond_to?(method)
        if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
          if main_app.respond_to?(method)
            true
          else
            super
          end
        else
          super
        end
      end
    end
  end

嘗試包含主要的app幫助方法。 例如:

class MyEngineClass
  include ApplicationHelper

  #...
end

您可能需要先請求該文件,但我希望Rails能夠在這種情況下正確找到它。

一旦包含ApplicationHelper,您應該能夠直接在控制器中使用這些幫助程序。

看起來你可以為許多Rails類調用ClassName.helper("application") - 不確定它是否可以在這里工作。

引擎應該獨立於主應用程序,這就是您無法從引擎訪問其助手的原因。

但是,有一些黑客方法可以讓您的引擎訪問主應用程序的幫助程序。 我就是這樣做的:

# In the main app
# initializers/share_helpers_path_with_engine.rb
PhotoGallery::Engine.class_eval do
  paths["app/helpers"] << File.join(File.dirname(__FILE__), '../..', 'app/helpers')
end

當然,您需要將PhotoGallery更改為引擎類的實際名稱。

請隨意查看Engines文檔(有關路徑的部分): http//edgeapi.rubyonrails.org/classes/Rails/Engine.html

嘗試在您的應用程序中創建一個幫助程序,並在引擎中使用相同的幫助程序名稱來覆蓋引擎幫助程序方法。

我發現這個討論特別有見地。 隔離引擎幫助程序下的Rails Engine API文檔中也有一些有趣的想法。

免責聲明:我在Rails 3.2引擎中只使用過這個解決方案。

如果您的引擎中有標准標題部分供應商/ gems / my_gallery_engine / app / views / application / _header.html.erb

然后,通過創建自定義的部分app / views / application / _header.html.erb ,在主應用中覆蓋它。

覆蓋是有效的,因為Rails的視圖模板搜索路徑(默認情況下)從主應用程序的app / views目錄開始,然后按加載順序搜索引擎的app / views

所有主要應用程序的助手都將部分提供。

暫無
暫無

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

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