2012-03-19 184 views
3

一方面,我有一個可安裝的引擎,比方說前面 正面包含我的資產和幾頁 它與MainApp隔離。我不希望它觸及主應用程序。可安裝引擎的軌道prepend_view_path

另一方面,我想要我的MainApp使用佈局和部分Front。 所以我設置的佈局是這樣的:

class ApplicationController < ActionController::Base 
    layout 'front/application' 
end 

但前/應用程序是指發動機的部分直接,因爲隔離的,這樣

render 'header' # front/ prefix is not required 

所以MainApp觀點嘗試加載應用程序/意見/應用/報頭,而不是應用程序/視圖/前/應用/報頭

要FIXE此我把像這樣的prepend_view_path:

class ApplicationController < ActionController::Base 
    layout 'front/application' 
    before_filter :prepend_front 
protected 
    def prepend_front 
     prepend_view_path "app/views/front" 
    end 
end 

但是這不起作用,因爲引擎路徑指向供應商。 引擎將它自己添加到prepend路徑列表中:〜/ main_app/vendor/private_gems/front-0.0.2/app/views 我的preprend_front方法創建了這個:〜/ main_app/app/views/front

我tryed以武力前面加上正確的路徑(但它看起來這麼髒):

prepend_view_path "#{Rails.root}/vendor/private_gems/front-0.0.2/app/views/front" 

我不工作,只是崩潰的應用程序...

而且我卡在這裏。也許我的設計錯了?

回答

0

最後我刪除了isolate屬性。 我將視圖移到了一個文件夾中,因此不在engine_app文件夾中。

唯一的最終決定是將EngineApp :: Engine.url_helper包含到MainApp應用程序控制器中。

的前置棧是這樣的:

  • 主要的應用程序前置的路徑
  • 主要應用瀏覽次數
  • 引擎意見

所以它是基於發動機,再加入主要的應用程序的東西在頂端。

1

默認情況下,Rails在視圖/文件中查找,但是當它沒有找到它時,它會查看引擎的視圖/。這意味着你必須追加視圖路徑,這樣Rails纔會查看主應用程序的視圖/然後查看引擎中的修改路徑,最後查看引擎的視圖/。那麼這將是堆棧:

  • 主要的應用程序的意見/
  • 發動機經修改的路徑(瀏覽量/正面/內部引擎)
  • 發動機的意見/

要做到這一點,進入application_controller.rb

class ApplicationController < ActionController::Base 

    before_filter :set_views_path 

    def set_views_path 
     append_view_path FnetIdentityRailsEngine::Engine.root.join('app', 'views', 'front') 
    end 
end 

如果您在引擎中預先修改了您的視圖路徑並修改了路徑,那麼您將無法獲得ab能夠覆蓋主應用程序中的引擎視圖。這就是爲什麼你想追加。

+0

確實很好洞察。謝謝 ;) – ProxyGear 2014-01-24 19:07:56

2

傑克的答案是完美的,除非你想在Rails引擎中做這件事(例如,如果你的引擎本身有'主題'需要不同的加載路徑)。在這種情況下,prepend_path和append_path不合適,因爲您要在引擎默認加載路徑之前但在應用程序加載路徑之後插入您的新加載路徑。

對此的解決方案(僅在Rails的3.2測試)是以下內容添加到您的引擎/lib/my_engine.rb文件:

config.after_initialize do 
    my_engine_root = MyEngine::Engine.root.to_s 
    paths = ActionController::Base.view_paths.collect{|p| p.to_s} 
    paths = paths.insert(paths.index(my_engine_root + '/app/views'), my_engine_root + '/app/views/themes/my_theme') 
    ActionController::Base.view_paths = paths 
end 

新的負載路徑my_engine_root + '/app/views/themes/my_theme'現在只是你的引擎之前,標準載入路徑my_engine_root + '/app/views'