Ruby on rails Rails嵌套对象形式*\u属性

Ruby on rails Rails嵌套对象形式*\u属性,ruby-on-rails,nested-forms,Ruby On Rails,Nested Forms,我正在使用Rails 2.3.2,并试图使嵌套对象窗体正常工作。我已经将问题缩小到Rails不使用*属性设置嵌套表单元素的问题,这些属性是启动accepts\u nested\u attributes\u进行处理所必需的 我的型号代码是: class Person < Party has_one :name, :class_name => "PersonName" accepts_nested_attributes_for :name, :allow_destroy =>

我正在使用Rails 2.3.2,并试图使嵌套对象窗体正常工作。我已经将问题缩小到Rails不使用*属性设置嵌套表单元素的问题,这些属性是启动accepts\u nested\u attributes\u进行处理所必需的

我的型号代码是:

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
参数不是:

{"person"=>{"name_attributes"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 
我得到:

{"person"=>{"name"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 
结果,我得到了一个类型不匹配异常。我遵循了来自的文档。我也遵循了和的建议

使用Firebug,我检查了我的表单,并将输入标记的name属性从name调整为name\u属性。这就产生了带有name_属性的参数,并且create工作得很好

我被卡住了,因为我不明白为什么我的表单没有生成名称的*\u属性表单

我尝试的另一件事是,我得到了在我的环境中工作的复杂表单示例。我已经浏览了控制器、模型和视图的每一寸,并将其与我的代码进行了比较。我找不到有什么不同。我知道这是件小事,如果有任何帮助,我将不胜感激


谢谢

不确定为什么这不适用,但作为一种解决方法,您可以在控制器的#create方法中使用params[:name]来更新person记录

person = Person.new(params[:person])
person.name << PersonName.new(params[:name])
person=person.new(参数[:person])

person.name不幸的是,我仍然无法理解为什么这个表单不能与嵌套的对象表单一起工作。我将其精简为最简单的数据,以复杂表单示例为起点重新开始。我结束了使用active_presenter从表单中收集x对象数据的过程。我将在窗体中的某个时候重新访问嵌套对象窗体。感谢您的帮助。

尝试将实际对象用于表单\u,用于:

form_for :person => form_for @person

后挡板没有被布置到正确的位置

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 %>
def新建
@person=person.new
结束
...
邮递员返回到正确的位置

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 %>
def新建
@person=person.new

@person.name=PersonName.new#我刚刚为同样的问题挣扎了大约一个小时

按照诺克的模式在控制器中使用新方法,然后将其放到您的视图中

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


<% end %>


如果您尝试一下,祝您好运,这对我来说是有效的。

认为我会分享我的解决方案,因为它略有不同-在我的情况下,我希望嵌套属性是动态的

在新的行动中:

  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|

非常贫民区,但它可以工作。

您的视图代码是什么样子的?我添加了视图代码的表示形式。注意:如果您没有定义“接受嵌套属性”选项,它也不能工作!但在你的情况下没关系:)。但我定义了“接受嵌套属性”选项。我和OP有同样的问题,tsdbrown的回答也对我有效。我不完全明白为什么。。。我有其他rails应用程序可以“他们应该”工作。tsdbrown的回答:谢谢你的建议。我可以使用active_presenter解决此问题。我正试图以正确的方式使用2.3嵌套对象形式来实现这一点,这样我就可以学习如何正确使用它。酷。如果你发现了一个使用嵌套对象形式的解决方案,也许你可以发布它,为了其他人?在我的例子中,这解决了它。不确定为什么不应该使用符号符号…你也可以写:@person.build\u name而不是@person.name=PersonName.new请看:是的,就是这样。仔细看一下医生: