我有一个文件,它有不同的远程服务器和本地服务器路径。
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")
但它似乎只读取了第一条路径。如果在第一个路径中找不到文件,如何确保它读取第二个路径?
由于
答案 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>
可以是development
,test
,production
或自定义环境。
在你的代码中,只是
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"
永远不会起作用,第一个字符串在逻辑上是真的,其余字符串是无关紧要的并被忽略。