Como criar um nome de caminho de junção seguro em ruby?

188

Meu ambiente de desenvolvimento Rails é baseado em Windows e meu ambiente de produção é baseado em Linux.

É possível que o VirtualHost seja usado. Suponha que um nome de arquivo precise ser referenciado na /publicpasta com File.open('/tmp/abc.txt', 'r').

—Mas no Windows deveria ser C:\tmp\abc.txt . Como posso associar um caminho correto para lidar com os dois ambientes diferentes?

prefix_tmp_path = '/tmp/'
filename = "/#{rand(10)}.txt"

fullname = prefix_tmp_path + filename # /tmp//1.txt <- but I don't want a double //

E quando prefix_tmp_path = "C:\tmp\" eu chegarC:\tmp\/1.txt

Qual é a maneira correta de lidar com os dois casos?

Jirapong
fonte

Respostas:

329

Eu recomendo usar o File.join

>> File.join("path", "to", "join")
=> "path/to/join"
Csexton
fonte
51

Uma coisa a notar. O Ruby usa um "/" para separador de arquivos em todas as plataformas, incluindo Windows, para que você não precise usar um código diferente para juntar as coisas em diferentes plataformas. "C: /tmp/1.text" deve funcionar bem.

File.join () é seu amigo por juntar caminhos.

prefix_tmp_path = 'C:/tmp'
filename = "#{rand(10)}.txt"
fullname = File.join(prefix_tmp_path, filename) # e.g., C:/tmp/3.txt
Daniel Von Fange
fonte