【问题标题】:RUBY: How to write a method, that accepts a file path as an argument, that loads a YAML file [closed]RUBY:如何编写一个方法,接受文件路径作为参数,加载 YAML 文件 [关闭]
【发布时间】:2017-07-10 17:40:31
【问题描述】:

我有方法:

`# 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" 放在方法中?

【问题讨论】:

  • “我收到一个错误。”您应该与您寻求帮助调试它的人分享该错误。
  • 你确定文件路径是.lib/emoticons.yml而不是./lib/emoticons.yml
  • @jaydel 抱歉,这是一个错字。我正在使用./lib/emoticons.yml,但它仍然给我错误
  • @coreyward 这里是错误:#load_library 接受一个参数,文件路径Failure/Error: expect { load_library("./lib/emoticons.yml") }.to_not raise_error expected no Exception, got #&lt;Errno::ENOENT: No such file or directory @ rb_sysopen - emoticons.yml&gt; with backtrace: # ./lib/translator.rb:6:in load_library' # ./spec/translator_spec.rb:4:in block (3 levels) in &lt;top (required)&gt;' # ./spec/translator_spec.rb:4:in block (2 levels) in ' # ./spec/translator_spec.rb:4:in `block (2 levels) in '
  • @M.C.看起来你的方法很好用——你的问题/问题是“为什么我会收到‘没有这样的文件’错误”。

标签: ruby-on-rails ruby yaml


【解决方案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。这个方法返回一个Pathname 实例,指向你的Rails 应用程序的目录。在Pathname 上一个方便的方法是join,它会自动连接您提供给它的字符串,并在其间放置必要的正斜杠,而不会重复。

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

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

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

【讨论】:

  • 谢谢@coreyward!我决定只设置变量的完整路径,然后将其用作参数
【解决方案2】:

用户绝对路径而不是相对路径

代替

.lib/emoticons.yml

尝试使用

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

【讨论】:

  • 我试图通过的测试是使用./lib/emoticons.yml 作为参数。我应该在方法中使用Rails.root.join('lib', 'emoticons.yml') 还是作为参数?
  • 使用Rails.root 保证您将使用Rails 项目根目录中的路径找到该文件。将其用作相对链接可能会变得不稳定和脆弱。
  • 建议将Rails.root.join('lib', 'emoticons.yml') 作为参数发送通过这样做,此方法将是通用的,可用于加载任何其他.yml 文件,只需在方法中传递参数即可
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2017-05-06
  • 2023-03-18
  • 2021-12-27
  • 2013-02-11
  • 2020-04-18
  • 2022-09-24
相关资源
最近更新 更多