Rails: form per creare/aggiornare più modelli
Probabilmente avrete già usato il metodo fields_for dei form per consentire la gestione di modelli correlati sia nelle relazione one-to-one sia nelle one-to-many.
1 2 ... 3 4 Street : 5 Zip code: 6 7
E’ comodo perchè come al solito fa tutto da sé!!
Nei nostri progetti usiamo un builder per i form, per una migliore gestione degli errori, degli hint, e delle label; per semplificare la sintassi nelle viste, senza usare il fields_for, ho fatto una piccola modifica al builder specificando l’object per il quale deve essere creato l’input field. In questo esempio c’è uno user con un associazione one-to-one al billing (che contiene le informazioni per la fatturazione), spero che il codice chiarisca il concetto:
1 2 include ActionView::Helpers::ActiveRecordHelper 3 include ActionView::Helpers::TagHelper 4 @src = '' 5 (field_helpers).each do |selector| 6 @src = @src + <<-END_SRC 7 def (field, options = {}) 8 .... 9 10 derived = options[:object] 11 options.delete(:object) 12 if derived 13 @object_name = derived.class.name.downcase 14 @object = derived 15 end 16 17 ... Altri controlli sui parametri passati al builder 18 ... 19 ... 20 21 (content_tag :div, (label_name ? 22 @template.content_tag("label" , label_name, :for => (object.class.to_s.downcase + '_' + field.to_s)) : '') + 23 super + other + 24 error_message_on(:object, field, (label_error) + " ") + hint, :class => "fl") + (help ? content_tag(:div, content_tag("p", help), :class => 'fr') : '') 25 26 end 27 END_SRC 28 # class_eval src, __FILE__, __LINE__ 29 end 30 end
La parte che c’interessa è questa:
1 derived = options[:object] 2 options.delete(:object) 3 if derived 4 @object_name = derived.class.name.downcase 5 @object = derived 6 end
Ridefinendo l’object_name e l’object creo un input per il modello correlato, che si comporterà come se aveste usato il fields_for:
1 3 Dati personali 4 5 6 7 8 Dati fiscali 9 10 11 12 13
Otterrete un html di questo genere:
1 2 Dati personali 3 Email 4 Nome 5 Cognome 6 Dati fiscali 7 Nome 8 Cognome 9 Indirizzo 10 11
Quindi nel method post avrete i params dello user e del suo relativo billing.


Grande Duccio !
Complimenti per il magnifico post !!!
Grazie!!!
A related ambiguity is questions which have the form of yes-no questions, but which are intended not to be. ,