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.
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.