Frage

Ich habe einen form_for Code

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

Es gibt den HTML -Code ohne Fields_for -Funktion aus

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

Wenn ich die Form_FOR an:

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

Es funktioniert einfach gut. Und es gibt aus:

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

wie ich will. Warum nicht das Symbol in Form_For gut funktioniert? Was ist Unterschied zwischen: a und @A in Form_for. Vielen Dank. Ich verwende Rails 2.3.8, Ruby 1.8.7, Chrome Webbrowser.

War es hilfreich?

Lösung

Dies ist eine häufige Quelle der Frustration. form_for Verhalten Sie sich tatsächlich anders, basierend darauf, ob Sie es ein Symbol oder ein Objekt übergeben. Wenn Sie es ein Symbol wie so übergeben:

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

Dann funktioniert der Formular Builder, richtet jedoch nur die Paramwerte ein und lädt die Standardwerte, wenn @Person existiert. Ihr Parmas -Hash wird so aussehen, wie es sollte:

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

Aber es wird Ihre Route nicht richtig einrichten. Es wird davon ausgegangen, dass Sie sich derselben Seite, auf der Sie bereits sind, einreichen möchten. Nun, wenn Sie ihm ein Objekt geben, form_for Wird viel mehr für Sie tun. Es wird prüfen, ob dieses Objekt neu oder aktualisiert wird, und es wird die Parameter des Formular -Tags zusammen mit einigen anderen Vorteilen entsprechend festgelegt.

Ehrlich gesagt kann ich es dir nicht sagen warum Sie verhalten sich anders. Die Symbolversion hat offensichtlich immer noch Zugriff auf die Instanzvariable (@person im obigen Beispiel), da die Felder mit ihren vorhandenen Werten besiedelt werden. Die einfache Lösung ist, dass das Übergeben einer Instanzvariablen immer der richtige Weg ist und richtig funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top