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
fonte
2012-08-07 22:42:46
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
@CamelCamelCamel Ho aggiornato la mia risposta originale con un esempio. –
Come posso restituire il file come preimpostato o come file dipendente da avatar_url? – CamelCamelCamel