Fields_For non funziona quando form_for Usa il simbolo
-
27-09-2019 - |
Domanda
Ho un codice form_for
<%form_for :a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
.....
<%f.fields_for :b do |b|%>
.....
<%b.fields_for :apples do |apple|%>
...
<%end%>
....
<%end%>
emette il codice HTML senza funzione Fields_For
<textarea cols="40" id="a_b_apples_content" name="a[b][apples][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>
Quando cambio forma_for in:
<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
funziona bene. E emette:
<textarea cols="40" id="a_b_apples_content" name="a[b_attributes][apples_attributes][0][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>
come voglio. Perché il simbolo in forma_for non funziona bene? Qual è la differenza tra: a e @a in forma_for. Grazie. Uso Rails 2.3.8, Ruby 1.8.7, browser Web Chrome.
Soluzione
Questa è una fonte comune di frustrazione. form_for
effettivamente si comporta in modo diverso in base al fatto che tu lo passi un simbolo o un oggetto. Se lo passi un simbolo, così:
<% form_for :person do |f| %>
<% f.text_field :name %>
<% end %>
Quindi il costruttore di moduli funzionerà, ma configurerà i valori parametri e caricherà i valori predefiniti se esiste @person. Il tuo hash parmas sembrerà che dovrebbe:
params = {
:person => {
:name => 'bob'
}
}
Ma non imposterà il percorso correttamente. Supponiamo che tu voglia inviare alla stessa pagina che hai già. Ora se gli dai un oggetto, form_for
Farò molto di più per te. Controllerà se questo oggetto è nuovo o aggiornato e imposterà i parametri del tag del modulo di conseguenza, insieme ad altri vantaggi.
Onestamente, non posso dirtelo perché Si comportano diversamente. La versione del simbolo ovviamente ha ancora accesso alla variabile di istanza (@person nell'esempio sopra) perché i campi verranno popolati con i loro valori esistenti. La soluzione facile è che passare una variabile di istanza è sempre la strada da percorrere e funzionerà correttamente.