2014-04-01 15 views
7

Ho bisogno di nomi di file univoci per i miei file.Genera un nome file univoco

def filename 
    "#{SecureRandom.urlsafe_base64}.gif" 
end 

Questo permette di risparmiare un file di questo tipo:

ylGP48WxZXOY2OQ_x9dxAA.gif 

tuttavia il suo rispettivo campo nella base di dati da salvare in questo modo:

jED48PRNz0asZzwYQXzecw.gif 

Penso che quello che sta accadendo è che Carrierwave è chiamando la funzione file_name quando sta scrivendo il file e quando salva l'istanza nel database, risultando urlsafe_base64 chiamato due volte e creando due stringhe diverse . Funziona perfettamente quando ho hardcoded un nome come test.

Quindi, come può fermarsi? So che è scandaloso chiedere, ma come posso fare in modo che Carrierwave usi lo stesso nome di file generato a caso nel database e durante la scrittura del file? Penso seriamente che questo dovrebbe essere considerato un bug.

+0

quando si desidera solo un nome di file unico, perché non si tenta di prendere in considerazione 'YYYYMMddHHmmss.gif' come il nome del file ..? –

+0

Sicuramente un'opzione. Spero solo che carrierwave non mi stia costantemente calpestando le dita dei piedi ... è buono ma potrebbe essere molto meglio. – user3067865

risposta

7

Questa è un'opzione:

def filename 
    random_string 
    end 

    protected 

    def random_string 
    @string ||= "#{SecureRandom.urlsafe_base64}.gif" 
    end 

Concordo carrierwave può un essere un po 'più intuitivo.

2

http://ruby-doc.org/stdlib-2.4.0/libdoc/tempfile/rdoc/Tempfile.html

File Temporanei

una classe di utilità per la gestione dei file temporanei. Quando si crea un oggetto Tempfile , verrà creato un file temporaneo con un unico nome file . Un oggetto Tempfile si comporta proprio come un oggetto File, e tu puoi eseguire tutte le normali operazioni su file: leggere dati, scrivere i dati , modificarne le autorizzazioni, ecc. Quindi sebbene questa classe non contenga esplicitamente tutti i metodi di istanza supportati da File, è possibile in chiamare qualsiasi metodo di istanza File su un oggetto Tempfile.

require 'tempfile' 

file = Tempfile.new('foo') 
file.path  # => A unique filename in the OS's temp directory, 
       # e.g.: "/tmp/foo.24722.0" 
       # This filename contains 'foo' in its basename. 
file.write("hello world") 
file.rewind 
file.read  # => "hello world" 
file.close 
file.unlink # deletes the temp file 
Problemi correlati