Ruby on rails Rails嵌套对象形式*\u属性
我正在使用Rails 2.3.2,并试图使嵌套对象窗体正常工作。我已经将问题缩小到Rails不使用*属性设置嵌套表单元素的问题,这些属性是启动accepts\u nested\u attributes\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 =>
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请看:是的,就是这样。仔细看一下医生: