我有一个模特:
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 =&gt; 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:phone在表单提交时按预期工作。
答案 0 :(得分:2)
我总是遇到让嵌套属性按我的方式工作的问题,但这可能有助于解决您的问题。
型号:
class Contact < ActiveRecord::Base
has_many :phones
accepts_nested_attributes_for :phones
end
控制器:
看到我们循环@contract.phones.build
50次,这会创建50个新实例。
class Contact < ApplicationController
def new
@contact = Contact.new
25.times do
@contact.phones.build
end
end
end
查看new.html.erb:
...
<%= p.semantic_fields_for :phones do |ec| %>
<%= ec.input :number %>
<% end %>
...
我确实试过几次拦截循环,遗憾的是没有明确的清洁效果。