2011-06-14 26 views
3

我曾希望將Rails應用程序同時用作引擎和獨立應用程序。Controlling Rails作爲引擎提取的應用程序的初始化

具體來說,我有一個新生的應用程序,我想插入到客戶的網站,但理想情況下,我想同樣輕鬆地將應用程序作爲獨立系統使用。但是,如果我的應用程序的引導版本中存在config/environments/*。rb,那麼在啓動依賴於我的引擎的應用程序啓動時,會出現未初始化常量錯誤; Rails抱怨MyEngineModule :: Application常量無法在development.rb中找到,我認爲這只是一個加載順序問題,因爲這在我運行應用程序獨立時不會發生。如果我刪除了development.rb,引用我的MyEngineModule :: Application的原始初始化器會抱怨,所以我試圖刪除它們,一切都很好。

偉大的,除了原來的應用程序不工作,因爲它的配置不見了。

是否可以對初始化加載順序(或加載路徑,引擎< Rails :: Engine類定義)進行一些調整,以防止在引擎上下文中加載原始配置和初始化程序,以及允許我將它們留在應用程序上下文中?

的簡單答案大概是這樣的,但我感覺固執,想知道怎樣才能讓我的最初目標可能:

  • 提取MyEngine代碼到發動機,刪除config/environments/*文件和config/initializers/*文件,並使客戶端應用程序依賴於此。
  • 製作一個「新」簡約應用程序依賴於MyEngine,並將環境文件和初始化程序移至NewApp。

假設我覺得有些不自然衝動,以保持我原來的應用程序可運行的,因爲它是,如果我想防止「發動機」加載「應用程序」的配置,有什麼處理,最好的方法是什麼?我認爲在開發過程中這只是一個真正的問題,因爲我可以阻止環境/ * .rb文件被拉入到gem本身,但我喜歡在開發引擎及其客戶端應用程序時能夠在本地進行測試。

回答

5

繼續我的回答我自己的深奧問題的傳統,這似乎是一個差強人意的替代方案是包括髮動機的環境中保護條款/ * RB,並且是這樣的初始化:

if defined? CuteEngine::Application 
    CuteEngine::Application.configure do 
    config.whatever = something 
    end 
end 

這以相對較小的成本解決了兩個Rails :: Application對象的問題。不是很高興,但我會活下去。

+0

這是我做得太完全相同的方式。 – Grocery 2011-06-15 14:49:12

1

顛覆新來者。

Rails 3.1帶有可掛載的引擎,這聽起來像你所描述的。該文檔是不是很大,將現有的代碼,但看起來這會做你想要什麼:

module CuteEngine 
    class Engine < ::Rails::Engine 
    isolate_namespace CuteEngine 
    end 
end 

在你的其他應用程序的途徑。RB文件,您將添加:

mount CuteEngine::Engine, at: "/cuteness" 

http://edgeguides.rubyonrails.org/engines.html#mounting-the-engine

http://railscasts.com/episodes/277-mountable-engines

+0

不幸的是,至少在我最後一次嘗試這個時,isolate_namespace不會阻止原始引擎化的gem環境/ *。rb在應用程序啓動時運行,這就是爲什麼我有原始問題。在當時的3.1版本中,這種行爲發生了變化,這當然是可能的。 – JasonTrue 2013-01-23 18:51:05

相關問題