2016-05-04 64 views
0

我有一個文件有不同的遠程服務器和本地服務器的路徑。紅寶石雙管道使用

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

我基本上想確保我的應用程序爲文件找到正確的路徑,無論我在哪個服務器上。

所以,我發現了一些像的Ruby語法雙管(||)象下面這樣:

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

但好像只讀取第一個路徑。如果在第一個路徑中找不到該文件,如何確保它讀取第二個路徑?

感謝

回答

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) 

這就是做了,至少有一種方式。

+1

)要正確縮進多行代碼,請將它們縮進四個空格或按格式化工具欄中的「{}'」按鈕,它將爲您執行此操作。 –

+0

正如你所說的,你的語法在rails控制檯中工作,但是當我真的在開發環境中運行應用程序時,它給了我一個錯誤,說這個語法是錯誤的。這個語法在Rails應用程序中不起作用嗎? – Jokingpsh

+0

應該工作嗎?用你當前的代碼更新你的原始q? – ezuk

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

這使用流量控制的例外:( – ezuk

0

我會建議把這些路徑放到一個環境特定的配置文件中。看看GitHub上的railsconfig/config

您已經安裝了寶石後,可以添加一個配置config/settings/<RAILS_ENV>.yml

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

其中<RAILS_ENV>可以developmenttestproduction或自定義的環境。

而在你的代碼,只需

File.read(Settings.json_file) 
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"將永遠不會工作,第一個字符串是邏輯真其餘的則無關緊要並被忽略。