2015-01-06 6 views
7

Sto utilizzando gemme paperclip e aws-sdk in un'app Rails 4.Non riesco a ottenere Paperclip per impostare correttamente i miei URL S3

mi definiscono l'opzione: percorso nella mia paperclip.rb configurazione, senza: l'opzione url:

Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename" 

Si risparmia le mie immagini caricate come tale:

http://s3.amazonaws.com/mybucket-development/profiles/avatars/000/000/026/original/image_file_name.png?1420575189

All fine, viene salvato in S3. Tuttavia, rifiuta di farmi leggere le immagini per la visualizzazione, ad es. = Profile.avatar.url (: medio). Quando vado a quell'URL nel browser mi dice di riformattarlo con il nome del bucket come dominio. Come:

http://mybucket-development.s3.amazonaws.com/profiles/avatars/000/000/026/original/image_file_name.png?1420575189

OK, non è un problema. Vado a quell'URL, posso vedere la mia immagine. Così ora ho bisogno di capire come ottenere Paperclip per formattare automaticamente gli URL come questo. Ho letto nella documentazione Paperclip che basta impostare

Paperclip::Attachment.default_options[:url] = ":s3_domain_url" 

E che devo anche impostare il: parametro di percorso o mi limiterò a ottenere una graffetta :: Errori :: InfiniteInterpolationError.

così mi sono messo il mio file di configurazione con entrambi abbinati:

Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename" 
Paperclip::Attachment.default_options[:url] = ":s3_domain_url" 

Non funziona ... cerco la demolizione del paperclip.rb e la messa in config/ambienti/* Ma non importa quello che faccio, salva ancora gli URL senza il dominio con il nome del bucket nel percorso.

Quindi due domande:

1) Come posso ottenere Paperclip per formattare automaticamente gli URL salvati in stile dominio?

2) O ancora meglio, come posso ottenere S3 per accettare gli URL di stile non di dominio, quello che Paperclip sta generando attualmente?

EDIT

Quindi, se aggiungo nell'opzione s3_host_name allora salva lo stile URL dominio. Quindi devo avere tutti e 3:

Paperclip::Attachment.default_options[:url] = ':s3_domain_url' 
Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename" 
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com' 

E salvo il mio URL del modello in questo modo:

http://mybucket-development.s3-us-west-2.amazonaws.com/profiles/avatars/000/000/026/original/image_file_name.png%3F1420580224

ma ora vedo che ho una codifica% 3F (" ? ") nell'URL che lo incasina.

+1

Hai creato un criterio bucket in S3? –

risposta

12

Va bene, così come indicato nel l'aggiornamento di cui sopra, per ottenere gli URL di dominio di stile per essere salvati da Paperclip devo includere tutti e 3 delle seguenti operazioni nella mia paperclip.rb:

Paperclip::Attachment.default_options[:url] = ':s3_domain_url' 
Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename" 
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com' 

credo c'è un problema correlato ai recenti aggiornamenti delle gemme, questo produce URL con codifiche che non funzioneranno da sole.

Quindi nei miei punti di vista ho dovuto aggiungere URI.unescape, come ad esempio

= image_tag URI.unescape (profile.avatar.url (: medio)) "?"

potrei anche impostare una richiamata sul modello di sostituire la 3F% con la prima di salvare.

Strano problema con Paperclip ... non so cosa stava succedendo. La prima app su cui ho lavorato su dove ho riscontrato questo problema.

+0

questo ha funzionato davvero per me. Grazie! – jfarn23

+2

Funziona perché stai impostando: s3_host_name che sovrascrive le altre impostazioni. In realtà puoi rimuovere: url e: path e funziona ancora. Ho guardato il codice sorgente a paperclip oggi e non sembra implementare correttamente la logica ": s3_domain_url" - o almeno, non aveva senso per me. – Troy

0

In paperclip.rb

Paperclip::Attachment.default_options[:s3_host_name] = 's3-ap-south-1.amazonaws.com' 

In production.rb

config.paperclip_defaults = { 
      storage: :s3, 
      s3_protocol: :https, 
      s3_credentials: { 
      bucket: ENV.fetch('S3_BUCKET_NAME'), 
      access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'), 
      secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'), 
      s3_region: ENV.fetch('AWS_REGION') 
} 

Questo più o meno ha funzionato bene per me con image_tag. Dovrebbe funzionare anche per te.

Problemi correlati