Ruby on rails 关于接受\u嵌套的\u属性\u的混淆
不知何故,我的印象是,Ruby on rails 关于接受\u嵌套的\u属性\u的混淆,ruby-on-rails,ruby,Ruby On Rails,Ruby,不知何故,我的印象是,接受的_嵌套_属性_将允许我通过父对象填充子对象: person.update_attributes person_hash 但在实践中,我最终做到了: person.address.update_attributes person_hash[:address] person_hash.delete :address person.update_attributes person_hash 现在,提及仅间接地接受_嵌套的_属性,并且该方法的API文档也相当神秘 1) 有
接受
的_嵌套_属性_将允许我通过父对象填充子对象:
person.update_attributes person_hash
但在实践中,我最终做到了:
person.address.update_attributes person_hash[:address]
person_hash.delete :address
person.update_attributes person_hash
现在,提及仅间接地接受_嵌套的_属性,并且该方法的API文档也相当神秘
1) 有没有人能为我们展示一些基本的用例?我的意思是,我理解它是如何声明的,我对它所带来的区别感到困惑
2) 我填充嵌套对象的方法是rails中的“正确”方法,还是有更“优雅”的方法
谢谢
更新模型,为了清楚起见
class Person < ActiveRecord::Base
has_one :address
accepts_nested_attributes_for :address
end
class-Person
为j更新2。表单声明是这样的
<% fields_for "people", person, :index => person.id do |person_form| %>
...
<% person_form.fields_for person.address do |address_form| %>
<%= address_form.text_field :street %>
<% end %>
...
<% end %>
person.id do | person|u form |%>
...
...
但是它给我的html名称像
人[66][address][street]
,而不是人[66][address\u attributes][street]
带有接受嵌套属性的您可以执行以下操作:
# example from railsapi.com
# view
<% form_for @person, :url => { :action => "create" } do |person_form| %>
Name: <%= person_form.text_field :name %>
...
<% person_form.fields_for :address do |address_fields| %>
Street : <%= address_fields.text_field :street %>
Zip code: <%= address_fields.text_field :zip_code %>
<% end %>
<% end %>
您可以使用
@person = Person.create(params)
有关详细信息。我希望有帮助
编辑
我不知道你的情妇为什么会这样:/
但是使用
#person.address.update_attributes person_hash.delete(:address) OR
person.address.update_attributes person_hash[:address]
person_hash.delete :address
person.update_attributes person_hash
这没有错。正如您所说,只需使用更优雅的代码即可。事实上,我以同样的方式声明表单,但我得到的参数名称样式为“people[66][address][street]”,而不是“people[66][address\u attributes][street]”,它不应该是form\u for:people
而不是fields\u for
?@j。不,我有一个表格声明用于几个“个人”记录。总的来说,在它的某个地方,有人说字段和表单在所有实际用途上都是一样的,只是不创建元素。我有“post”,:id=>“edit\u tips\u form”)do%>包含了所有内容。我尝试了相同的东西:(但至少,现在我明白了它应该如何工作,谢谢:)我更新了我的答案。不幸的是,我不知道为什么参数会这样:/
#person.address.update_attributes person_hash.delete(:address) OR
person.address.update_attributes person_hash[:address]
person_hash.delete :address
person.update_attributes person_hash