formtastic - подмножество значений в acceptpts_nested_attributes_for - PullRequest
2 голосов
/ 13 декабря 2010

У меня есть модель:

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: телефоны, работающие должным образом при отправке формы.

1 Ответ

2 голосов
/ 19 января 2011

У меня всегда были проблемы с получением вложенных атрибутов, работающих так, как я хочу, но это может помочь решить вашу проблему.

Модель:

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

Я попытался несколько попыток перехватить петлю, к сожалению, без какой-либо определенной чистой пользы.

...