开发者

formtastic - subset of values in accepts_nested_attributes_for

I have a model:

class Contact < ActiveRecord::Base
  has_many :phones
  accepts_nested_attributes_for :phones
end

I want to build 50 phone #s that users can add (there may already be phones 1 or 5, but I always want 50 available) In my controller:

while contact.phones.length < 50
  contact.phones.build({:phone_type_id => PhoneType['a_cool_type'].id})
end

In my view, I want to have 2 columns of phone #s 25 rows each

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

Obviously the line:

<%= form.inputs :for => :phones[25..49] do |phone_form| %>

doesn't work, but it conveys my intention ( I hope). I want to have more control over how formtastic grabs the underlying object association.

The following works, but I can't do two columns easily without fancy css.

<%= form.inputs :for => :phones do |phone_form| %>

Any suggestions?

---------- Update ----

I was able to get around this in a roundabout way: I built up a separate list of phone #s not as contact.phones.build, but Phone.new(:contact_id => contact.id) and store those in a list called @new_phones

Then my form looks like this:

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

This allowed me to display 25 phones on one part of the page, and 25 on another, with nested_attributes_for :phones working as expected on form submit.


I've always had problems with getting nested attributes working as I want but this may help resolve your issue.

Model:

class Contact < ActiveRecord::Base
  has_many :phones
  accepts_nested_attributes_for :phones
end

Controller: See we're looping @contract.phones.build 50 times, this creates 50 new instances.

class Contact < ApplicationController
  def new
    @contact = Contact.new
    25.times do
      @contact.phones.build
    end

  end
end

View new.html.erb :

...
<%= p.semantic_fields_for :phones do |ec| %>
  <%= ec.input :number %>
<% end %>
...

I did try a few attempts to intercept the loop, sadly with no definite clean avail.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜