fields_for создает форму для ресурса? - PullRequest
0 голосов
/ 08 декабря 2011

Предположим, у меня есть модель Person с адресами has_many. Если в контроллере я делаю 3.timestimes@person.addresses.build}, должен ли следующий код генерировать 3 набора text_fields для адреса? По какой-то причине я получаю только 1 адресную форму, независимо от того, сколько адресов я строю в контроллере. Я использую Rails 3.0

 <%= form_for @person do |person_form| %>
    <%= person_form.fields_for :addresses do |address_fields| %>
      Street  : <%= address_fields.text_field :street %>
    <% end %>
  <% end %>

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

Вы можете обернуть свой блок fields_for внутри каждого цикла и передать каждый экземпляр в качестве аргумента fields_for. Например:

<%= form_for @person do |person_form| %>
  <% @person.addresses.each do |address| %>  
    <%= person_form.fields_for :addresses, address do |address_fields| %>
      Street  : <%= address_fields.text_field :street %>
    <% end %>
  <% end %>
<% end %>

Кроме того, вы можете передать коллекцию в качестве аргумента fields_for и сделать так, чтобы она автоматически повторялась:

<%= form_for @person do |person_form| %>
  <%= person_form.fields_for :addresses, @person.addresses do |address_fields| %>
    Street  : <%= address_fields.text_field :street %>
  <% end %>
<% end %>

См. http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

1 голос
/ 08 декабря 2011

Форма выглядит хорошо.Согласно документации (ri fields_for), в модели Person должны быть методы чтения и записи addresses.У вас уже есть метод reader (потому что вы указали, что Person has_many: address), поэтому теперь вам нужен метод writer - вы можете либо создать его «вручную» (def addresses_attributes=(...)), либо позволить accepts_nested_attributes_for определить писателя для вас.

0 голосов
/ 08 декабря 2011

Во-первых, вам понадобится accepts_nested_attributes_for :addresses в вашей Person модели.Во-вторых, использование build действительно просто создаст, но не сохранит записи.Если вы хотите сохранить этот пример, продолжайте что-то вроде этого:

3.times { @person.addresses.create }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...