2012-02-10 51 views
22

我創建了一個簡單的Rails引擎爲應用程序提供一些常規功能(照片庫)。我希望能夠覆蓋標準的_header部分,以便畫廊的菜單與我的主應用程序相匹配。在我的頭文件視圖中,我調用了一個屬於application_helpers(主應用程序)一部分的幫助程序,但我一直收到「未定義的方法」錯誤。從我可以告訴主應用程序application_helpers不包括(顯然)當我覆蓋引擎應用程序佈局或其部分。重寫Rails引擎時訪問主應用程序幫助程序視圖/佈局

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

我是否需要重寫控制器?看起來很多隻是爲了得到一些幫手。

感謝

的Rails 3.1.3

+5

你試過'main_app.your_helper_method'? – glebm 2012-08-26 20:29:50

+0

如果您不想要,請嘗試使用此[問題]中概述的方法(http://stackoverflow.com/questions/10879150/isolated-engine-doorkeeper-use-helper-methods-from-the-main-app)覆蓋控制器 – Matt 2013-01-09 18:25:42

回答

1

嘗試以覆蓋引擎的輔助方法與你的引擎輔助的同名應用程序創建一個幫手。

我發現this discussion特別有見地。 Rails Engine API docs孤立引擎助手也有一些有趣的想法。

+0

Rails Engine API文檔幫助我找出了url_helpers的一個很好的解決方案!謝謝。 – 2015-01-31 03:30:55

2

嘗試包括主要的應用程序幫助器方法。例如:

class MyEngineClass 
    include ApplicationHelper 

    #... 
end 

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

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

它也看起來像你可以撥打ClassName.helper("application")許多Rails類 - 不知道這是否會在這裏工作。

0

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

如果在您的引擎中有標準標頭部分vendor/gems/my_gallery_engine/app/views/application/_header.html.erb

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

的覆蓋工作,因爲Rails的應用程序/視圖目錄視圖模板的搜索路徑(默認情況下)與主應用程序啓動,然後搜索通過加載順序引擎應用程序/視圖

所有主應用程序的助手都將在部分中可用。

1

引擎應該獨立於主應用程序,這就是爲什麼你不能從引擎訪問其助手。

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

# 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到您的引擎類的實際名稱。

隨意看看發動機文檔(約路徑部分):http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

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 
+1

這只是增加'_path'和'_url'幫手,這是我需要的。雖然有更好的解決方案。將'helper Rails.application.routes.url_helpers'添加到引擎的ApplicationController中。在鏈接的博客文章中查看我的評論。 – 2015-01-31 03:30:05

+0

對於OP,您可能可以使用與'helper Rails.application.helpers'相同的技術。 – 2015-01-31 03:32:27

相關問題