Ruby双管道用法

时间:2016-05-04 23:53:57

标签: ruby-on-rails ruby

我有一个文件,它有不同的远程服务器和本地服务器路径。

Remote server path:
"/app/public/front-end/public/JSONModels/IdPairing/Text.json"
Local server path:
"public/front-end/public/JSONModels/IdPairing/Text.json"

我基本上想确保我的应用程序找到文件的正确路径,无论我在哪台服务器。

所以我在Ruby语法中发现了像double pipe(||)这样的东西,如下所示:

File.read("/app/public/front-end/public/JSONModels/IdPairing/Text.json" || "public/front-end/public/JSONModels/IdPairing/Text.json")

但它似乎只读取了第一条路径。如果在第一个路径中找不到文件,如何确保它读取第二个路径?

由于

4 个答案:

答案 0 :(得分:1)

懒惰的方式是:

begin
  File.read("/app/public/front-end/public/JSONModels/IdPairing/Text.json")
rescue
  File.read("public/front-end/public/JSONModels/IdPairing/Text.json")
end

答案 1 :(得分:0)

为什么它不起作用:

irb(main):001:0> File.read("some made up name")
Errno::ENOENT: No such file or directory - some made up name
        from (irb):1:in `read'
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
irb(main):002:0> File.read("some made up name" || "Gemfile")
Errno::ENOENT: No such file or directory - some made up name
        from (irb):2:in `read'
        from (irb):2
        from /usr/bin/irb:12:in `<main>'

正如您所看到的,当您尝试读取不存在的文件时,Ruby会爆炸。

这就是exist?的用途。

你应该做什么

irb(main):003:0> filename = File.exist?("some made up name") ? "some made up name" : "Gemfile"
=> "Gemfile"
irb(main):004:0> File.read(filename)

这是一种方法,至少。

答案 2 :(得分:0)

我建议将这些路径放入特定于环境的配置文件中。在GitHub上查看railsconfig/config

安装gem后,您可以将配置添加到config/settings/<RAILS_ENV>.yml,如

json_file: /app/public/front-end/public/JSONModels/IdPairing/Text.json

其中<RAILS_ENV>可以是developmenttestproduction或自定义环境。

在你的代码中,只是

File.read(Settings.json_file)

答案 3 :(得分:0)

如果您想按顺序尝试这些,请先定义一个列表:

FILES = [
  "/app/public/front-end/public/JSONModels/IdPairing/Text.json",
  "public/front-end/public/JSONModels/IdPairing/Text.json"
]

然后你可以简单地打开存在的第一个:

path = FILES.find { |f| File.exists?(f) }

File.open(path)

问题是"string" || "string"永远不会起作用,第一个字符串在逻辑上是真的,其余字符串是无关紧要的并被忽略。