2016-04-01 18 views
7

voglio scrivere qualcosa su un file.Errno :: ENOENT (Nessun file o directory @ rb_sysopen

# 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 

Quando viene eseguito questo codice, sto ottenendo questo errore. So che questa cartella doesn' t esistono, ma File.open con modalità w crea un nuovo file se non esiste.

Perché questo non funziona?

risposta

12

File.open(..., 'w') crea un file se non esiste. Nessuno ha promesso che creerà una cartella albero per questo

Un'altra cosa, si dovrebbe usare File#join per creare il percorso della directory, piuttosto che la concatenazione di stringhe stupide.

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 
+0

Basta essere curiosi: Perché è consigliabile File.join qui? Unisce i componenti del percorso sempre con il separatore specifico della piattaforma (ad esempio '\' su Windows). Mentre ci ** sono ** casi, dove questo è ciò che vogliamo ottenere, di solito cerchiamo di restare con '/' su tutte le piattaforme, perché questo dà meno mal di testa per quanto riguarda la portabilità. Nel caso del codice pubblicato qui, non vedo perché i separatori di file specifici della piattaforma potrebbero essere un vantaggio. – user1934428

+1

@ user1934428 "di solito proviamo ad attaccarci con/su tutte le piattaforme, perché questo dà meno mal di testa per quanto riguarda la portabilità" - non si tratta di sciocchezze, l'uso di "File.join" aiuta ad evitare errori stupidi come quello nell'OP: Rails.root' non termina con una barra e usando '+' restituisce '/ railsrootpublic /' (notare la mancanza di barra qui sopra) – mudasobwa

+0

@mudasobwa: Nella mia console rails Rails.root + "bla/bla" GIves corretti path :) – ashwintastic

14

Cercando di utilizzare gets all'interno di un'attività rake? Si può essere vedendo questo messaggio di errore:

Errno :: ENOENT: Nessun file o directory @ tale rb_sysopen

Avete provato a cercare l'errore, e finiscono in questa pagina? Questa risposta non è per l'OP, ma per te.

Utilizzare STDIN.gets. Problema risolto. Questo perché il solo utilizzo di gets risolve di nuovo a $stdin.gets e il rake sta sovrascrivendo la variabile globale in modo che gets tenti di aprire un handle di file che non esiste. Ecco perché:

What's the difference between gets.chomp() vs. STDIN.gets.chomp()?

+0

Questo vale anche per l'uso di 'gets' all'interno di un Vagrantfile. – bschlueter

+3

Stai facendo il lavoro di dio – user3062913

Problemi correlati