2017-03-16 79 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