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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top