2017-03-16 75 views
1

我的寶石生成以下文件的信息加載到配置/ my_gem.ymlRubygem:如何YAML文件

test: true 

現在我想負載測試的價值到我的寶石模塊要能撥打:

MyGem.test 
=> true 

這是我的嘗試:

在Rails應用程序 - 配置/初始化/ my_gem.rb:

CONFIG_PATH = "#{Rails.root}/config/my_gem.yml" 
MY_GEM = YAML.load_file(CONFIG_PATH)[Rails.env] 

創業板 - 的lib/my_gem.rb:

def self.test 
    ::MY_GEM[:test] 
end 

,但我得到的例外,因爲MY_GEM未被識別爲常量(在lib/my_gem.rb

c:/RailsInstaller/Ruby2.3.​​0/lib/ruby/gems/2.3.0/gems/my_gem-0.1.0/lib/my_gem.rb:11:in`test':未初始化的常量MY_GEM(NameError)

+0

不要稱你的寶石「寶石」 - 這是令人困惑的。真的,不要。在Rails應用程序初始化之前,gem將被加載。嘗試從寶石內讀取配置文件。 – Raffael

+0

@Raffael好吧,我會改變這一點。只是爲了展示目的而這樣稱呼 – jonhue

+0

對不起,如果我有點教條。這真的好多了:D – Raffael

回答

3

你應該能夠在你的寶石做這個加載應用YAML文件:

YAML.load_file('config/my_gem.yml') 

這就要求工作目錄是你的Rails應用程序的根 - 也就是當你調用軌的情況下命令,而在該目錄中。

+0

它可以很容易:)不需要'Rails.root' - 好! – jonhue

1

這裏需要注意兩點。首先是你的initializer在之後被調用,但是在這個gem本身被加載之後,但是在rails運行之前。這提供了一個機會來做任何最後一刻的配置。如果寶石期望初始化器首先運行,那麼它會進入粗魯的覺醒狀態。

第二個是這樣的YAML將有字符串鍵,所以即使您的常量被定義,ABCDEFG[:test]將是nil。您必須用字符串鍵引用它,或遞歸地對數據使用symbolize_keys

+0

好吧,所以我需要解析我的寶石內的'yml'文件。我如何才能獲得gem所用應用程序的config目錄的正確路徑? – jonhue

+0

如果你不知道該文件將在哪裏,你需要推遲加載它,直到初始化器觸發。 – tadman