Forum: Italian Ruby user group Paperclip con modelli nidificati

Posted by Marco Mastrodonato (marcomd)
on 2010-03-04 12:32
Se si rimane nello standard funziona, purtroppo io non riesco mai a far
parte dello standard ed ho questo grattacapo:

ho un modello lettera che può avere molti allegati. Il modello allegato
e formato da qualche campo più il file gestito con paperclip.

I file li salvo con un url e path personalizzato:
  has_attached_file :file,
    :url =>
"#{PREFIX}/assets/:letter_id_:id_:attachment_:basename.:extension",
    :path =>
":rails_root/public/assets/:letter_id_:id_:attachment_:basename.:extension"

ora la parte poco standard: per valorizzare quel :letter_id devo
aggiungere il token nell'interpolazione:

Paperclip::Attachment.interpolations[:letter_id] = proc do |attachment,
style|
  attachment.instance.letter.id
end

Ha sempre funzionato perchè gli allegati si aggiungevano dopo la
creazione della lettera.
Ora che sto implementando un'altra creazione (massiva) mi viene molto
comodo utilizzare i modelli nidificati. Tutto si svolge dentro il
letter.save e quando va ad "esplodere" quel token, l'oggetto letter non
ha ancora un id e viene sollevata un'eccezione. Mi chiedo perchè questo
viene fatto prima e non dopo quando avrei già l'id, qualcuno si è già
imbattuto o ha qualche idea?
Posted by Pietro Giorgianni (giorgian)
on 2010-03-04 12:55
(Received via mailing list)
Il 04 marzo 2010 12.32, Marco Mastrodonato <m.mastrodonato@gmail.com>
ha scritto:
> Ora che sto implementando un'altra creazione (massiva) mi viene molto
> comodo utilizzare i modelli nidificati. Tutto si svolge dentro il
> letter.save e quando va ad "esplodere" quel token, l'oggetto letter non
> ha ancora un id e viene sollevata un'eccezione. Mi chiedo perchè questo
> viene fatto prima e non dopo quando avrei già l'id, qualcuno si è già
> imbattuto o ha qualche idea?

Ciao,

premetto che non ho mai usato PaperClip.

Vediamo se ho capito: stai usando fields_for o qualcosa del genere?

Se è così, quello che avviene è che viene invocato un metodo di
Letter, qualcosa tipo attachments_attributes=, a cui viene passata
della roba. Ciò avviene prima che venga invocato letter.save, e quindi
l'id non 
c'è.
Quanto alla soluzione, non ho idea. :(

Se invece non ho capito, ignora  per favore questo messaggio.


pietro
Posted by Marco Mastrodonato (marcomd)
on 2010-03-04 14:01
Ciao Pietro, ho risolto!
Avrei potuto gestirmelo manualmente ma era un peccato rinunciare a 
quella genialiata di fields_for.
Ho aggiunto un file paperclip in un progetto di prova che avevo usato 
per testare i modelli nidificati. Ho visto che li funzionava alla 
perfezione, il primo giro l'oggetto era nil ma poi dopo qualche 
tentativo l'oggetto veniva creato e riusciva ad ottenere l'id. Tutto 
questo dentro paperclip.
Nel mio progetto invece, il tutto era sotto una transazione e dopo il 
primo giro veniva invocata la rollback perchè non era gestita 
l'eccezione all'interno di paperclip. Mi è bastato non far sollevare 
l'eccezione dentro il token:

Paperclip::Attachment.interpolations[:letter_id] = proc do |attachment, 
style|
  attachment.instance.letter.id if attachment.instance.letter
end

Et voilà!
Grazie per la risposta.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.