Je veux écrire quelque chose dans un fichier.
# where userid is any intger [sic]
path = Rails.root + "public/system/users/#{user.id}/style/img.jpg"
File.open(path, 'wb') do |file|
file.puts f.read
end
Lorsque ce code est exécuté, j'obtiens cette erreur. Je sais que ce dossier n'existe pas, mais File.open
avec w
le mode crée un nouveau fichier s'il n'existe pas.
Pourquoi ça ne marche pas?
File.open(..., 'w')
crée un fichier s'il n'existe pas. Personne n'a promis de créer une arborescence de répertoires.
Une autre chose, il faut utiliser File#join
pour construire le chemin du répertoire, plutôt que la concaténation de chaînes muettes.
path = File.join Rails.root, 'public', 'system', 'users', user.id.to_s, 'style'
FileUtils.mkdir_p(path) unless File.exist?(path)
File.open(File.join(path, 'img.jpg'), 'wb') do |file|
file.puts f.read
end
Essayer d'utiliser gets
dans une tâche de rake? Vous pouvez voir ce message d'erreur:
Errno :: ENOENT: Aucun fichier ou répertoire de ce type @ rb_sysopen
Avez-vous essayé de rechercher l’erreur et vous êtes retrouvé sur cette page? Cette réponse n'est pas pour le PO, mais pour vous.
Utilisation STDIN.gets
. Problème résolu. C’est parce que le simple fait d’utiliser gets
résout le problème de $stdin.gets
and rake remplace la variable globale de sorte que gets
essaie d'ouvrir un descripteur de fichier inexistant. Voici pourquoi:
Quelle est la différence entre gets.chomp () et STDIN.gets.chomp ()?