Comment faire un chemin d'accès sécurisé en ruby?

189

Mon environnement de développement Rails est basé sur Windows et mon environnement de production est basé sur Linux.

Il est possible que VirtualHost soit utilisé. Supposons qu'un nom de fichier doit être référencé dans le /publicdossier avec File.open('/tmp/abc.txt', 'r').

- mais sous Windows, cela devrait l'être C:\tmp\abc.txt. Comment puis-je effectuer une jointure de chemin correcte pour gérer les deux environnements différents?

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

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

Et quand prefix_tmp_path = "C:\tmp\"je reçoisC:\tmp\/1.txt

Quelle est la bonne façon de traiter les deux cas?

Jirapong
la source

Réponses:

330

Je recommande d'utiliser File.join

>> File.join("path", "to", "join")
=> "path/to/join"
csexton
la source
51

Une chose à noter. Ruby utilise un "/" pour séparateur de fichiers sur toutes les plates-formes, y compris Windows, vous n'avez donc pas besoin d'utiliser un code différent pour joindre des éléments sur différentes plates-formes. "C: /tmp/1.text" devrait fonctionner correctement.

File.join () est votre ami pour joindre des chemins ensemble.

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
la source