2011-09-07 10 views
20

Ho CarrierWave che funziona bene attraverso la tipica configurazione ORM e carica tramite modulo. Mi piacerebbe capire come utilizzare CarrierWave al di fuori del contesto di invio del modulo. Ad esempio, quando un utente si registra mi piacerebbe prendere il suo gravatar e memorizzarlo con CarrierWave. Ecco cosa ho, e non funziona:CarrierWave come archiviare il file nell'url dato

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon" 

uploader = ImageUploader.new 
uploader.store! gravatar_url 

Nessun errore neanche. Ho cercato sul Web e non sono riuscito a trovare una soluzione.

risposta

16

Ho avuto un sacco di problemi nel cercare di capire come ottenere store! per lavorare con percorsi di file locali. Si scopre che store! effettivamente accetta un file come parametro, non una stringa.

Per l'URL, è necessario prima il numero require 'open-uri', quindi aprire il file/url. Qualcosa del genere dovrebbe funzionare:

require 'open-uri' 
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon" 
tempfile = open(gravatar_url)  

uploader = ImageUploader.new 
uploader.store! tempfile 

Lo stesso funziona con un percorso di file, ma non c'è bisogno di richiedere open-uri in quel caso.

17

In realtà è possibile farlo utilizzando la proprietà incorporata remote_{attribute}_url se si utilizzano gli helper record/model attivi (vedere il file di trasmissione CarrierWave per i dettagli). Tuttavia, ho scavato intorno nel codice sorgente un po 'per vedere come funziona davvero e sembra che, anche se non si è si dovrebbe essere in grado di utilizzare il seguente:

uploader = ImageUploader.new 
uploader.download! some_remote_url 
uploader.store! 

fare un tentativo.

+0

Sembra una soluzione più sicura. – Codii

+0

Questo è il migliore, perché con questo metodo salviamo l'estensione del file. – merqlove

+0

Fantastico, grazie! –

44

nel controllore dopo che l'utente Registrati (supponendo che il campo immagine utente viene chiamato semplicemente 'immagine')

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon" 
@user.remote_image_url = gravatar_url 
@user.save 

penso che questo sia il modo migliore in base alle carrierwave docs e qualche ricerca in giro.

buon divertimento!

+0

Funziona alla grande. Grazie! Ho passato molto tempo a capire metodi più complessi. – rohitmishra

+2

felice di poterti aiutare! questo è un metodo veramente utile quando si importa da social o da qualsiasi apis di servizio. – nurinur

+0

Voglio usare questo nel callback before_create perché uso devise dove non ho controller, ma non funziona. – aisensiy

Problemi correlati