6

Rails 2.3.2 を使用しており、ネストされたオブジェクト フォームを適切に機能させようとしています。Rails が、accepts_nested_attributes_for 処理を開始するために必要な *_attributes を使用してネストされたフォーム要素を設定していないという問題に問題を絞り込みました。

私のモデルコードは次のとおりです。

class Person < Party
  has_one :name, :class_name => "PersonName"
  accepts_nested_attributes_for :name, :allow_destroy => true
end

class PersonName < ActiveRecord::Base
  belongs_to :person
end

ビューのコードは次のようになります (HAML を使用しています)。

%h3 New customer
= error_messages_for :person, :person_name, :name, :country

- form_for :person, :url => collection_url, :html => {:class => 'MainForm'} do |person_form|

  - @person.build_name unless @person.name
  - person_form.fields_for :name do |name_form|
    = name_form.label :given_name, "First Name:"
    = name_form.text_field :given_name

    = name_form.label :family_name, "Last Name:"
    = name_form.text_field :family_name

  = hidden_field_tag :inviter_id, params[:inviter_id]
  = hidden_field_tag :inviter_code, params[:inviter_code]
  %p= submit_tag "Create"

= link_to 'Back', collection_url

params の代わりに:

{"person"=>{"name_attributes"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 

私は得る:

{"person"=>{"name"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 

その結果、TypeMismatch 例外が発生します。Ryan Daigleのドキュメントに従いました。このブログcomplex-forms-exampleのアドバイスにも従っています。

Firebug を使用して、フォームを調べ、入力タグの名前属性を name から name_attributes に調整しました。これにより、name_attributes を持つパラメーターが生成され、作成は正常に機能しました。

私のフォームが名前の *_attributes フォームを生成しない理由がわからないので、私は立ち往生しています。

私が試したもう1つのことは、自分の環境でcomplex_form_exampleが機能するようになったことです。コントローラー、モデル、ビューの隅々まで調べて、自分のコードと比較しました。何が違うのか見つけられません。私はこれが小さなことであることを知っており、助けていただければ幸いです!

ありがとう!

4

6 に答える 6

1

私はまったく同じ問題で約1時間苦労しています!

コントローラーの新しいメソッドの nowk のパターンに従い、これをビューに入れます

<% form.fields_for :name, @person.name do |name_form| %>


<% end %>

頑張ってみてください。それが私にとってはうまくいきました。

于 2009-08-19T16:29:42.473 に答える
0

残念ながら、このフォームがネストされたオブジェクトフォームで機能しない理由をまだ理解できていません。私はそれを最も単純なデータに分解し、complex-form-exampleを最初に使用してやり直しました。私はactive_presenterを使用してフォームからxオブジェクトデータを収集することを終了しました。フォーム内のネストされたオブジェクトフォームをいつか再検討します。ご協力いただきありがとうございます。

于 2009-04-16T16:49:00.763 に答える
0

少し異なるので、ソリューションを共有すると思いました-私の場合、ネストされた属性を動的にしたいのです。

新しいアクション:

  case params[:type]
  when "clubber"
    @account = resource.send "build_#{params[:type]}"
  when "promoter"
    @account = resource.send "build_#{params[:type]}"
  when "company"
    @account = resource.send "build_#{params[:type]}"
  when "venue_owner"
    flash[:notice] = 'We ask that venue owners register via the web. Thanks.'
    redirect_to root_path and return
  end

私からしてみれば:

= f.fields_for @account.class.name.downcase+'_attributes' do |form|

かなりゲットーですが、うまくいきます。

于 2011-09-07T00:55:21.733 に答える
0

これが機能しない理由はわかりませんが、回避策として、controller#create メソッドで params[:name] を使用して person レコードを更新することができます。

person = Person.new(params[:person])
person.name << PersonName.new(params[:name])
于 2009-04-13T17:37:22.733 に答える