2011-02-16 16 views
7

我正在開發Rails3引擎應用程序,並且我想使用Haml作爲視圖。要求在Rails3引擎上使用Haml的最佳方式

首先,我所做的就是把它添加到發動機的Gemfile:

gem "haml" 

雖然我是測試我的引擎,它工作正常(我用https://github.com/josevalim/enginex生成的寶石,並對其進行測試虛擬應用程序)。

當我試圖在真正的Rails應用程序上使用引擎時,我的問題就開始了。應用程序在它自己的Gemfile上沒有gem「haml」,所以它沒有初始化Haml,所以我收到的模板沒有找到錯誤,因爲它沒有查找.haml視圖。我在想,通過在引擎上要求Haml,Rails應用程序也需要它。

我已經爲現在做的是在發動機上增加一個配置/初始化/ haml.rb與此代碼:

require 'haml' 
Haml.init_rails(binding) 

它的工作了,但我不知道這是否真的是一個好方法來做到這一點。 爲什麼Rails沒有調用Haml「init.rb」文件,因此只需將gem「haml」添加到引擎Gemfile中就可以正確初始化Haml?

回答

6

我想你將不得不把haml放在引擎gemspec中作爲一個依賴項,以便bundler在目標應用程序中安裝haml(並在其Gemfile.lock中顯示)。就像這樣:

Gem::Specification.new do |s| 
    s.add_dependency(%q<haml>, [">= 0"]) 
end 

我剛剛在我的一個引擎上測試了這一點。如果沒有.gemspec中的依賴項,它不會在目標應用程序中安裝haml(不會出現在Gemfile.lock中)。之後,我加入HAML到gemspec作爲依賴,但它顯示出來:

PATH 
    remote: /rails_plugins/mine/my_engine 
    specs: 
    my_engine (0.0.0) 
     formtastic 
     haml 
     inherited_resources 
     settingslogic 
     sqlite3-ruby 

GEM 
    remote: http://rubygems.org/ 
    specs: 
    #................ 
    haml (3.0.25) 
    #................ 

如果您使用的珠寶商,它會依賴添加到自動根據什麼是你的Gemfile ..它甚至增加了在gemspec如果您在Gemfile中定義了組,則爲developement_dependency。我只是簡單地看了一下enginex,所以我不知道它是否有類似的rake任務來構建gemspec。

這可能有助於澄清一些事情:

http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

+4

這有幫助。還有必要確保在發動機的某個位置包含「需要'haml'」。 – higginbotham 2011-05-28 12:22:55

+0

是的,我想我離開了。我通常將它添加到主ruby文件。對於my_plugin,它會出現在my_plugin/lib/my_plugin.rb的頂部 – johnmcaliley 2011-05-28 14:17:38

19

有兩件事是必要的。首先,在.gemspec:

s.add_dependency 'haml', ['>= 3.0.0'] 

而在你的lib/gem_name.rb:

require 'haml' 

然後運行bundle無論是寶石和應用程序的目錄裏。