Fields_for ne fonctionne pas lorsque Form_For Utiliser Symbol
-
27-09-2019 - |
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.
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.