Ruby on rails 嵌套窗体轨道

Ruby on rails 嵌套窗体轨道,ruby-on-rails,ruby,forms,associations,nested-forms,Ruby On Rails,Ruby,Forms,Associations,Nested Forms,我有2个型号的用户和地址 class User < ActiveRecord::Base has_many :addresses accepts_nested_attributes_for :addresses end class Address < ActiveRecord::Base belongs_to :user end 另外,如果有更好的方法,我将非常感谢您的建议。表示,的字段将在地址集合中的每个元素上重复 <%= f.fields_for :

我有2个型号的用户和地址

class User < ActiveRecord::Base 
  has_many :addresses
  accepts_nested_attributes_for :addresses
end

class Address < ActiveRecord::Base
  belongs_to :user
end
另外,如果有更好的方法,我将非常感谢您的建议。

表示,的
字段将在地址集合中的每个元素上重复

   <%= f.fields_for :addresses, @user.addresses do |a| %>
     <p> <%= a.object.label %> </p>
     <%= a.text_field :state %>
     <%= a.text_field :country%>
     <%= a.text_field :street %>
   <% end %>
我建议在你的地址上加一种标签(比如工作、家庭等)。然后它应该自己工作。有了这个标签,当你想添加更多的地址时,你的手机会更加灵活

   <%= f.fields_for :addresses, @user.addresses do |a| %>
     <p> <%= a.object.label %> </p>
     <%= a.text_field :state %>
     <%= a.text_field :country%>
     <%= a.text_field :street %>
   <% end %>


字段\u for:地址已经为您执行循环,因此您无需重复州、国家和街道。因此,在您的情况下,您可以添加新的字段地址类型,然后控制器应如下所示:

def new
  @user = User.new
  @user.addresses.build(address_type: 'Home')
  @user.addresses.build(address_type: 'Work')
end
然后以以下形式:

<%= form_for @user do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
    <%= f.fields_for :addresses do |a| %>
      <%= a.hidden_field :address_type %>
      <p><%= a.object.address_type %></p>
      <%= a.text_field :state %>
      <%= a.text_field :country%>
      <%= a.text_field :street %>
    <% end %>
  <% end %>
<% end %>


a、 对象是指地址对象。

仅最后一个对象是什么意思?您在这里显示的输出清楚地表明您正在接收这两种信息。addresses_attributes[0]和addresses_attributes[1]是的,但我填写了所有字段,只填写了最后3个发送的字段。例如:前3个字段用“test0”填充,最后3个字段用“test”填充。好的,我尝试了你所说的,我得到了一个未定义的方法“is_home_address”,用于nil:NilClass错误,有什么想法吗?你是否将address_type迁移到了db?当您访问表单时是否会发生此错误?我更新了我的答案,将隐藏字段添加到address_类型中,以便将其持久化到db。如果仍然存在问题,请尝试使用调试:。我认为您应该重新检查@user.save中的代码。看起来有一些代码删除了用户的地址。好的,我试过你说的,我得到了一个未定义的方法“is_home_address”,用于nil:NilClass错误,有什么想法吗?你能提供一些更多的信息吗?一些行号和这个号码周围的代码?我发现总是很难猜到错误:Pok我通过将表单包装成@user.addresses.each do | address |并将address对象添加到字段_中来修复错误:addresses,address。。。。现在我可以访问该对象。。。但是参数更改了params[:user][:address],并且只发送了一个地址。Mhh,您可以尝试为@user.address do | a |
创建
字段。恢复您上次的更改。好的,我照您说的做了,看起来我只有一个地址对象,但我在控制器中构建了两个对象。。。
def new
  @user = User.new
  @user.addresses.build(address_type: 'Home')
  @user.addresses.build(address_type: 'Work')
end
<%= form_for @user do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
    <%= f.fields_for :addresses do |a| %>
      <%= a.hidden_field :address_type %>
      <p><%= a.object.address_type %></p>
      <%= a.text_field :state %>
      <%= a.text_field :country%>
      <%= a.text_field :street %>
    <% end %>
  <% end %>
<% end %>