# Paperclip con modelli nidificati

**URL:** <https://www.ruby-forum.com/t/paperclip-con-modelli-nidificati/184557>\
**Category:** IT\
**Created:** [March 4, 2010, 12:32pm UTC](https://www.ruby-forum.com/t/paperclip-con-modelli-nidificati/184557 "2010-03-04T12:32:52Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [March 4, 2010, 12:32pm UTC](https://www.ruby-forum.com/t/paperclip-con-modelli-nidificati/184557/1 "2010-03-04T12:32:52Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [March 4, 2010, 12:55pm UTC](https://www.ruby-forum.com/t/paperclip-con-modelli-nidificati/184557/2 "2010-03-04T12:55:24Z")

</div>

Il 04 marzo 2010 12.32, Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [March 4, 2010, 2:01pm UTC](https://www.ruby-forum.com/t/paperclip-con-modelli-nidificati/184557/3 "2010-03-04T14:01:49Z")

</div>

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.
