fields_for是否为每个资源创建表单?

时间:2011-12-08 09:38:26

标签: ruby-on-rails

假设我有一个具有多个地址的Person模型。如果在控制器中我做了3次{@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 个答案:

答案 0 :(得分:1)

您可以将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 :(得分:1)

表格看起来不错。根据文档(ri fields_for),您需要在Person模型中同时拥有addresses reader和writer方法。您已经拥有了reader方法(因为您声明Person has_many:addresses),所以现在您需要编写方法 - 您可以“手动”创建它(def addresses_attributes=(...))或让accepts_nested_attributes_for定义作家为你。

答案 2 :(得分:0)

首先,您的accepts_nested_attributes_for :addresses模型中需要Person。其次,使用build实际上只是构建而不是保存记录。如果你想保留这个例子,继续这样的事情:

3.times { @person.addresses.create }