我有一个模型:
class Contact < ActiveRecord::Base
has_many :phones
accepts_nested_attributes_for :phones
end
我想构建 50 个用户可以添加的电话(可能已经有电话 1 或 5,但我总是希望 50 个可用)在我的控制器中:
while contact.phones.length < 50
contact.phones.build({:phone_type_id => PhoneType['a_cool_type'].id})
end
在我看来,我希望有 2 列电话号码,每列 25 行
<%= semantic_form_for contact do |form| %>
<table width=50%>
<%= form.inputs :for => :phones[0..25] do |phone_form| %>
<td align="center"><%= phone_form.input :number, :label => false %></td>
....
<% end %>
</table>
<table width=50%>
<%= form.inputs :for => :phones[25..49] do |phone_form| %>
<td align="center"><%= phone_form.input :number, :label => false %></td>
....
<% end %>
</table>
<%end %>
显然这条线:
<%= form.inputs :for => :phones[25..49] do |phone_form| %>
不起作用,但它传达了我的意图(我希望)。我想更好地控制 formtastic 如何获取底层对象关联。
以下工作,但如果没有花哨的 css,我无法轻松完成两列。
<%= form.inputs :for => :phones do |phone_form| %>
有什么建议么?
- - - - - 更新 - -
我能够以一种迂回的方式解决这个问题:我建立了一个单独的电话列表列表,而不是 contact.phones.build,而是 Phone.new(:contact_id => contact.id) 并将它们存储在一个名为的列表中@new_phones
然后我的表格如下所示:
<%= semantic_form_for @contact, :url => ..., do |f| %>
<% @new_phones[0...25].each_with_index do |phone, i| %>
<%= f.fields_for :phones, phone, :child_index => i do |phone_form| %>
<%= render "phone_fields", {:phone_form => phone_form, :phone => phone} %>
<%end%>
<% end %>
....
<% @new_phones[25...50].each_with_index do |phone, i| %>
<%= f.fields_for :phones, phone, :child_index => i+25 do |phone_form| %>
<%= render "phone_fields", {:phone_form => phone_form, :phone => phone} %>
<%end%>
<% end %>
<%end%>
这使我可以在页面的一个部分显示 25 部手机,在另一部分显示 25 部,其中 nested_attributes_for :phones 在表单提交时按预期工作。