Paperclip con modelli nidificati

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?

Il 04 marzo 2010 12.32, Marco M. [email protected]
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. :frowning:

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

pietro

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.