fileds_forはform_forを使用する場合に動作しません。シンボルを使用します

StackOverflow https://stackoverflow.com/questions/4053849

質問

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の違いは何ですか。ありがとう。 Rails 2.3.8、Ruby 1.8.7、Chrome Webブラウザーを使用しています。

役に立ちましたか?

解決

これは一般的なフラストレーションの源です。 form_for 実際には、シンボルまたはオブジェクトを渡すかどうかに基づいて、異なる動作をします。あなたがそれをシンボルを渡すなら、そうするように:

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

その後、フォームビルダーは動作しますが、パラマル値をセットアップし、@Personが存在する場合にデフォルト値をロードします。あなたのParmas Hashはそれがすべきであるように見えます:

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

しかし、それはあなたのルートを適切にセットアップすることはありません。既にいるのと同じページに送信したいと仮定します。今、あなたがそれにオブジェクトを与えるなら、 form_for あなたのためにもっと多くのことをします。このオブジェクトが新しいか、更新されているかを確認するためにチェックし、他のいくつかの利点とともに、それに応じてフォームタグのパラメーターを設定します。

正直なところ、私はあなたに言うことができません どうして 彼らは異なって振る舞います。シンボルバージョンには、フィールドに既存の値が入力されるため、インスタンス変数(上記の例の@Person)にアクセスできるようになりました。簡単な解決策は、インスタンス変数を通過することが常に進む方法であり、正しく機能することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top