我正在使用 Rails 2.3.2,并试图让嵌套对象表单正常工作。我已将我的问题缩小到 Rails 没有使用启动 accept_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_attributes。这产生了具有 name_attributes 的参数,并且创建工作正常。
我被困住了,因为我无法弄清楚为什么我的表单没有生成名称的 *_attributes 形式。
我尝试的另一件事是我让 complex_form_example 在我的环境中工作。我浏览了控制器、模型和视图的每一寸,并将其与我的代码进行了比较。我找不到有什么不同。我知道这是一件小事,如果有任何帮助,我将不胜感激!
谢谢!