2010-12-13 38 views
2

J'ai un modèle:formtastic - sous-ensemble de valeurs dans accepts_nested_attributes_for

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

Je veux construire 50 #s téléphone que les utilisateurs peuvent ajouter (il y a peut-être déjà des téléphones 1 ou 5, mais je veux toujours 50 disponible) Dans mon contrôleur:

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

à mon avis, je veux avoir 2 colonnes de 25 lignes téléphoniques chaque

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

Il est évident que la ligne:

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

ne fonctionne pas, mais il transmet mon intention (je l'espère). Je veux avoir plus de contrôle sur la façon dont formtastic saisit l'association d'objet sous-jacente.

Les travaux suivants, mais je ne peux pas faire deux colonnes facilement sans css fantaisie.

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

Une suggestion?

---------- ---- Mise à jour

j'ai pu contourner ce d'une manière détournée: Je construit une liste séparée de téléphone #s pas de contacts. phones.build, mais Phone.new (: contact_id => contact.id) et stocker ces données dans une liste appelée @new_phones

Alors ma forme ressemble à ceci:

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

cela m'a permis d'afficher 25 téléphones sur une partie de la page, et 25 sur un autre, avec nested_attributes_for: téléphones fonctionnant comme ex pected sur le formulaire submit.

+0

J'ai été en mesure d'accomplir ce dont j'avais besoin d'un rond-point façon –

Répondre

2

J'ai toujours eu des problèmes avec le fonctionnement des attributs imbriqués, mais cela peut aider à résoudre votre problème.

Modèle:

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

Controller: Voir nous en boucle @contract.phones.build 50 fois, cela crée 50 nouveaux cas.

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

    end 
end 

Voir new.html.erb:

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

J'ai essayé quelques tentatives d'interception de la boucle, malheureusement sans succès propre précis.

+1

merci d'avoir donné un coup de feu homme. J'ai posté une solution qui a fonctionné pour moi. très appréciée. –

+0

Vous devriez avoir posté la solution comme réponse, et l'avoir marquée comme correcte. ;-) –