Вложенные Формы Рельсы - PullRequest
       28

Вложенные Формы Рельсы

4 голосов
/ 27 марта 2012

У меня есть 2 модели User и Address.

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

class Address < ActiveRecord::Base
  belongs_to :user
end

Мой контроллер

  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

И мой View

 <%= 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 %>

Моя проблема в том, что я получаю толькопоследнее состояние, страна, улица указываются в параметрах.

"addresses_attributes"=>{"0"=>{"street"=>"test", "state"=>"test",, "country"=>"test"},
"1"=>{"street"=>"", "state"=>"", "country"=>""}} 

Также, если есть лучший способ сделать это, я буду признателен за любые предложения.

Ответы [ 2 ]

5 голосов
/ 27 марта 2012

API rails говорит, что 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 %>
3 голосов
/ 27 марта 2012

fields_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.object ссылается на адрес объекта.

...