嵌套表单Rails

les*_*sce 4 ruby forms ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

我的控制器

  def new
    @user = User.new
    @user.addresses << Address.new
    @user.addresses << Address.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      #do something
    else
      render 'new'
    end
  end
Run Code Online (Sandbox Code Playgroud)

而我的观点

 <%= form_for @user do |f| %>
     <%= f.label :name %>
     <%= f.text_field :name %>
       <%= f.fields_for :addresses do |a| %>
         <p> Home </p>
         <%= a.text_field :state %>
         <%= a.text_field :country%>
         <%= a.text_field :street %>
         <p> Work </p>
         <%= a.text_field :state %>
         <%= a.text_field :country%>
         <%= a.text_field :street %>
       <% end %>
     <% end %>
   <% end %>
Run Code Online (Sandbox Code Playgroud)

我的问题是我只获得最后一个州,国家,街道进入参数.

"addresses_attributes"=>{"0"=>{"street"=>"test", "state"=>"test",, "country"=>"test"},
"1"=>{"street"=>"", "state"=>"", "country"=>""}} 
Run Code Online (Sandbox Code Playgroud)

此外,如果有更好的方法,我会感激任何建议.

klu*_*ump 5

轨道API称,fields_for会被它重复自我过地址的集合中的每个元素.

我建议在你的地址中添加一种标签(如工作,家庭等).然后它应该自己工作.使用此标签,当您想要添加更多地址时,您会更灵活一些.

   <%= 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 %>
Run Code Online (Sandbox Code Playgroud)