Ruby on rails 如何从Gem读取文件(.yml)

Ruby on rails 如何从Gem读取文件(.yml),ruby-on-rails,ruby,file,gem,Ruby On Rails,Ruby,File,Gem,我想从我的主应用程序读取Rails引擎Gem中包含的.yml文件。该文件位于config/test.yml IO.read(“config/test.yml”)失败,因为@rb\u sysopen没有这样的文件或目录 如果我将文件移动到主应用程序中,一切正常。但我需要将此文件保存在Gem中。解决方案1 您可以将根路径存储在主gem文件中的常量中,并在代码的其他位置检索它。您必须确保gem在应用程序中的代码运行之前已初始化,否则将出现错误,因为不会定义常量 # lib/my_gem.rb GEM_

我想从我的主应用程序读取Rails引擎Gem中包含的.yml文件。该文件位于
config/test.yml

IO.read(“config/test.yml”)
失败,因为@rb\u sysopen没有这样的文件或目录


如果我将文件移动到主应用程序中,一切正常。但我需要将此文件保存在Gem中。

解决方案1

您可以将根路径存储在主gem文件中的常量中,并在代码的其他位置检索它。您必须确保gem在应用程序中的代码运行之前已初始化,否则将出现错误,因为不会定义常量

# lib/my_gem.rb
GEM_ROOT = File.expand_path("../..", __FILE__)

# app/.../some_class.rb
IO.read("#{GEM_ROOT}/config/test.yml")

解决方案2

最明智的做法是,您可以通过编程方式从
Bundler
获取gem路径,然后使用该根路径检索yml文件的完整路径


看看这个,你可以很容易地适应你的情况

你应该能够通过在你的gem中这样做来加载app yaml文件:

YAML.load_文件('config/test.yml'))


我正在尝试从主应用程序中读取gem的yml文件,我没有尝试在同一gem中读取gem的yml文件。看起来
gem\u ROOT
在主应用程序中也可用。这个答案肯定适用于这两种情况。thanksI没有得到:)相应地编辑了我的答案