Question

J'ai un formulaire

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

Il publie le code HTML sans fonctions_ pour une fonction

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

Quand je change la forme_for en:

<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>

Cela fonctionne bien. Et il sort:

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

comme je veux. Pourquoi le symbole de Form_For ne fonctionne-t-il pas bien? Quelle est la différence entre: A et @A dans Form_For. Merci. J'utilise Rails 2.3.8, Ruby 1.8.7, Chrome Web Browser.

Était-ce utile?

La solution

C'est une source courante de frustration. form_for se comporte en fait différemment selon que vous le transmettez un symbole ou un objet. Si vous le transmettez un symbole, comme ainsi:

<% form_for :person do |f| %>
  <% f.text_field :name %>
<% end %>

Ensuite, le générateur de formulaire fonctionnera, mais il ne configurera les valeurs de Param que et chargera les valeurs par défaut si @Serson existe. Votre hachage de parmas ressemblera à ce qu'il devrait:

params = {
  :person => {
    :name => 'bob'
  }
}

Mais il ne configurera pas votre itinéraire correctement. Il supposera que vous souhaitez vous soumettre à la même page sur laquelle vous êtes déjà. Maintenant, si vous lui donnez un objet, form_for fera beaucoup plus pour vous. Il vérifiera si cet objet est nouveau, ou en cours de mise à jour, et il définira les paramètres de la balise de formulaire en conséquence, ainsi que d'autres avantages.

Honnêtement, je ne peux pas vous dire Pourquoi Ils se comportent différemment. La version symbole a évidemment accès à la variable d'instance (@Serson dans l'exemple ci-dessus) car les champs seront remplis de leurs valeurs existantes. La solution facile est que passer une variable d'instance est toujours la voie à suivre et fonctionnera correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top