9

Gli utenti nel mio sito possono caricare le proprie foto per un modello o scegliere da una libreria. Quando gli utenti scelgono dalla libreria, invio il nome del file come stringa al server {file: {url: 'url.jpg'}}. Non ho trovato un modo in cui carrierwave può semplicemente aggiornare un file di modello senza caricarlo. Posso scrivere una condizione nel mio modello che controlli l'esistenza di quel parametro e quindi model.file = File.open('str.jpg'). È così male da una vista di sicurezza? Come posso "caricare" i file, o semplicemente aggiornare l'attributo del file, per fare riferimento a un file che è già disponibile sul server?Carrierwave - "caricamento" di un file da una stringa

Grazie!

risposta

4

La soluzione di utilizzare File.open avrebbe funzionato, ma è necessario verificare che il nome è valido con File.basename in modo che qualcuno non poteva passare ../../secret_credentials.yml e esporre informazioni a cui non vuoi che siano. Anche controllarlo contro la lista di immagini preimpostate sarebbe una buona idea.

Tuttavia, è possibile farlo in modo più efficiente ignorando CarrierWave in questo caso.

Aggiungi un nuovo campo chiamato library_image, quando qualcuno desidera utilizzare un'immagine preimpostata, quindi imposta library_image, se desidera utilizzare la propria foto, disattiva library_image e carica la foto normalmente. Quindi aggiungere un metodo di supporto come:

def avatar_url 
    if self.library_image? 
     "http://example.com/images/#{self.library_image}" 
    else 
     self.picture.url 
    end 
end 

Questo presuppone che si possono trovare le immagini predefinite a http://example.com/images/[name] e si utilizza mount_uploader in CarrierWave chiamato picture.

Ora ogni volta che si desidera visualizzare la propria immagine, si chiama avatar_url che controlla se deve restituire l'URL preimpostato o l'immagine caricata.

Un esempio di come si dovrebbe aggiornare library_image o picture in base alla domanda iniziale:

if params[:file].is_a?(Hash) 
    model.library_image = params[:file][:url] 
    model.remove_picture = true 
else 
    model.library_image = nil 
    model.picture = params[:file] 
end 
+0

Come posso rilevare che l'utente sta caricando una nuova foto? Voglio dire, qual è il nome della funzione di callback che dovrei scrivere per resettare la libreria_immagine? Grazie! – CamelCamelCamel

+0

@CamelCamelCamel Ho aggiornato la mia risposta originale con un esempio. –

+0

Come posso restituire il file come preimpostato o come file dipendente da avatar_url? – CamelCamelCamel

3

Vorrei creare un'altra risorsa denominata LibraryImages che contiene questi file di immagine.

Questi sarebbero in relazione con la classe Utente utilizzando l'associazione has_many. il secondo è quello di separare quando un utente vuole utilizzare la propria immagine invece di uno predefinito.

quindi suggerirei di aggiungere un tipo booleano chiamato 'use_library', una volta che scelgono di usare la propria immagine, verranno caricati su user.image senza problemi.

ora nella vista Basta chiedere se l'use_library restituisce true se in modo da utilizzare image_tag(user.library_image)