RUBY:如何编写一个接受文件路径作为参数的方法来加载YAML文件

时间:2017-07-10 17:40:31

标签: ruby-on-rails ruby yaml

我有方法:

`# require modules here
 require "yaml"

def load_library(file_path) # code goes here file_path = YAML.load_file('emoticons.yml') file_path end

我试图让它加载emoticons.yml文件,但是当我尝试使用文件路径参数运行该方法时

load_library(".lib/emoticons.yml")

我收到以下错误:

<Errno::ENOENT: No such file or directory @ rb_sysopen - emoticons.yml>

回溯:

./lib/translator.rb:6:in load_library' 
./spec/translator_spec.rb:4:in block (3 levels) in <top (required)>' 
./spec/translator_spec.rb:4:in block (2 levels) in <top (required)>' 
./spec/translator_spec.rb:4:in `block (2 levels) in <top (required)>'

语法有问题,或者我需要将require "yaml"放在方法中吗?

2 个答案:

答案 0 :(得分:1)

您遇到的问题是您希望File命令将应用程序根目录用作当前目录(pwd),但它使用ENV['PWD']

例如,如果您的文件位于app/helpers/yaml.rb,则您对Yaml.load_file的调用将在app/helpers/lib/emoticons.yml处查找该文件。

如果文件实际位于另一个目录中,例如your_rails_app/lib/emoticons.yml,则可以指定目录(In Ruby, how do I specify a file in another directory as an input?)。

Rails还有一种更简单的方法:Rails.root。此方法返回指向Rails应用程序目录的Pathname实例。 Pathname上的一个方便的方法是join,它将自动连接你提交的字符串,并在两者之间放置必要的正斜杠而不重复。

因此,您可以使用它来指定Yaml.load_file的文件的完整路径:

YAML.load_file(Rails.root.join('lib', 'emoticons.yml'))

如果要在方法中处理,或者可以在发送给方法的参数中指定完整路径。

答案 1 :(得分:0)

用户违反路径而不是相对路径

而不是

.lib/emoticons.yml

尝试使用

Rails.root.join('lib', 'emoticons.yml')