1

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

fields_for関数なしでhtmlコードを出力します

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

form_forを:に変更すると

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

それはうまくいきます。そしてそれは出力します:

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

私が望むように。form_forの記号がうまく機能しないのはなぜですか?form_forの:aと@aの違いは何ですか?ありがとう。私はレール2.3.8、ルビー1.8.7、クロームウェブブラウザを使用しています。

4

1 に答える 1

1

これは、フラストレーションの一般的な原因です。 form_for実際には、シンボルとオブジェクトのどちらを渡すかによって、動作が異なります。あなたがそれにシンボルを渡すならば、そのように:

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

その後、フォームビルダーは機能しますが、パラメータ値のみを設定し、@personが存在する場合はデフォルト値をロードします。パルマハッシュは次のようになります。

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

ただし、ルートが正しく設定されません。すでに表示しているのと同じページに送信することを前提としています。今、あなたがそれにオブジェクトを与えるならば、あなたのためにform_forもっと多くのことをするでしょう。このオブジェクトが新しいか更新されているかを確認し、それに応じてフォームタグのパラメータを設定し、その他の利点もあります。

正直なところ、なぜ彼らの振る舞いが違うのかは言えません。フィールドには既存の値が入力されるため、シンボルバージョンは明らかにインスタンス変数(上記の例では@person)にアクセスできます。簡単な解決策は、インスタンス変数を渡すことが常に道であり、正しく機能することです。

于 2010-10-29T17:18:22.940 に答える