2011-10-11 147 views
6

這是更多的實驗 - 我知道我可以用--full做到這一點,但我想在應用程序中使用命名空間功能來避免衝突rails 3.1.1引擎 - 可安裝引擎,是否可以訪問父應用程序資產,默認佈局?

這個想法是有一個主要的應用程序 - 處理認證,常見的物品,管理員屏幕等 然後創建引擎添加更多功能,例如

  • CRM
  • CMS
  • 博客
  • 維基
  • 論壇

這些引擎我可以挑選我需要什麼樣的應用程序我建立。 這可能嗎?

是否只是應用--mountable和--full選項的情況?

進行實驗 - 會不會有任何問題,如果我使用完整的選項添加rspec的再簡單添加

rails plugin new plugin_name --skip-test-unit --full --dummy-path=spec/dummy 

和LIB \ PLUGIN_NAME \ engine.rb

module PluginName 
    class Engine < Rails::Engine 

    # this is added by rails when an engine is mountable 
    # to isolate the plugin and prevent name clashes 
    isolate_namespace PluginName 

    # one of the additions to make rspec work from command line for the plugin 
    config.generators do |g| 
     g.test_framework :rspec, :view_specs => false 
    end 
    end 
end 

我已經創建無論是 - full和--mountable引擎,並rspec最後工作的任何人閱讀那裏有一些偉大的文章(見下文),但想知道這樣做的解決方案,我想創造的更廣泛的影響

我仍在玩這個,並會張貼我的發現..
任何幫助/討論將大規模讚賞。

請注意

  1. 爲什麼我要做到這一點 - 一次構建,多次使用...
  2. 我絕不會希望有一個非技術/客戶端添加「插件/引擎」 - 這是純粹的娛樂點1

問題我有...

  1. 在頂級應用程序上運行服務器。只有在從引擎訪問內容時,(我可以通過錯誤消息看到)我有一個路由問題(root_path未定義或設計路由缺失) - 父應用程序佈局正在呈現,我可以在提取的錯誤源中看到它。進步,但沒有雪茄!

有用的參考

+0

我失去了一些東西明顯大量的... ...如果我從父複製的路由引擎的路線,它工作正常進行安裝......做同樣的 - 完全按照上面指定的路線不起作用 – Spasm

回答

2

我設法通過以下步驟此工作:

  1. 在我父應用程序,我安裝了發動機routes.rb中

    mount PluginName::Engine => '/plugin_name' 
    

    我只是刪除它。

  2. 創建一個應用程序控制器,如Ryan Bigg所述。

    class PluginName::ApplicationController < ApplicationController 
        ... 
    end 
    
  3. 正如我想有東西名稱生成控制器,模型,測試時讓你有基本上註釋掉隔開isolate_namespace PluginName的lib \ PLUGIN_NAME \ engine.rb當我想要的寶石在父要運行應用程序。

    這還不是一個理想的解決方案。關閉我的頭頂,我可以使用類似的東西:

    isolate_namespace PluginName if %w[development testing].include?(Rails.env) 
    

    但將不得不測試這是否可行。

榮譽給瑞恩幫助我找到我的路非常感謝

此外,同樣可以用--mountable版本切換來完成,所有你需要做的就是在你的引擎配置一個進一步的步驟/路線。RB取代

PluginName::Engine.routes.draw do 

Rails.application.routes.draw do 
+0

用這個保存了我的屁股。謝謝。 – codykrieger

1

是的,你可以refe只是引用它們在你的應用程序像正常倫斯父應用程序資產:

<%= stylesheet_link_tag "application %> 

雖然不知道你爲什麼會想這樣做,因爲......

我要回答你的第一個問題並回答你的第二個問題。

要使用應用程序的佈局,您將需要修改引擎中的ApplicationController(這是命名空間),並使其在引擎中繼承ApplicationController

然後,這將使用發動機提供的佈局的引擎的控制器。我是doing this in my engine, forem

有一天,這將在the Engines Guide中涵蓋,在撰寫本文時,目前正在撰寫。

+0

感謝您回覆我,我已經閱讀了您網絡上點點點滴的文章。訪問父資產只會是佈局,但在我第一次嘗試使用mountable時,這是不可能的,因爲它們是完全獨立的。 這就是爲什麼我想使用完整的選項,但仍然名稱間距因此繼承父應用程序,但名稱間隔的應用程序。想知道會有什麼影響..檢查一下forem來收集一些信息。 – Spasm