ruby-on-rails – Rails嵌套对象表单* _attributes

我正在使用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

而不是参数:

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

我明白了:

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

结果,我得到了一个TypeMismatch异常.我遵循了Ryan Daigle的文档.我也遵循了this blogcomplex-forms-example的建议.

使用Firebug,我浏览了我的表单,并将输入标记的name属性从name调整为name_attributes.这产生了带有name_attributes的参数,并且创建工作正常.

我陷入困境,因为我无法弄清楚为什么我的表单没有生成名称的* _attributes形式.

我尝试的另一件事是我在我的环境中使用complex_form_example.我已经浏览了控制器,模型和视图的每一寸,并将其与我的代码进行了比较.我找不到有什么不同.我知道这是小事,并希望得到任何帮助!

谢谢!

解决方法

邮政后卫不会被送到正确的地方
def new
  @person = Person.new
end

<% form_for @person do |f| %>
    <% f.fields_for :name_attributes do |p| %>
        ...
    <% end %>
<% end %>

邮政后卫被送往正确的地方

def new
  @person = Person.new
  @person.name = PersonName.new # << this allows fields_for :relation vs :relation_attributes
end

<% form_for @person do |f| %>
    <% f.fields_for :name do |p| %>
        ...
    <% end %>
<% end %>

#create中不需要@ person.name

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...