0

J'ai ce problème:problème Rails accepts_nested_attributes_for

Mon application Web a une forme où les utilisateurs peuvent personnaliser leur profil. Dans chaque profil peut être spécifié de nombreuses compétences et je veux permettre aux utilisateurs d'appuyer sur un bouton (ajouter une nouvelle compétence) afin de spécifier autant de compétences qu'ils le souhaitent. Donc, c'est le code du contrôleur:

accepts_nested_attributes_for :skills, :allow_destroy=>true, :reject_if => lambda {|a| a[:name].blank?} 

C'est la forme (seulement la partie avec la compétence d'attribut imbriqué):

<%= f.fields_for :skills do |builder|%> 

    <div class="field"> 

     <%= builder.label :skill %> 
     <%= builder.text_field :name%> 
       <%= builder.hidden_field :_destroy %> 

       <%= link_to 'remove', '#', :onclick=>'removeField()'%> 
    </div> 
        <%end%> 

Ce travail de forme parfaitement et montre chaque compétence de l'utilisateur, il Le problème maintenant, c'est que je veux ajouter un lien pour "ajouter une nouvelle compétence" donc une fonction javascript qui change le formulaire et ajouter un nouveau champ de saisie de compétences, je n'ai vraiment aucune idée de la façon d'agir, principalement parce que les attributs imbriqués ont un identifiant et un nom spécifiques sous la forme que je ne comprends pas:

<input id="profile_skills_attributes_0_name" name="profile[skills_attributes][0][name]" size="30" type="text" value="Mathematicansszz" /> 

Il ajoute également un autre champ caché avec l'identifiant de la compétence (impossible de prédire si la compétence est pas créée) rendent impossible la création de nouvelles compétences partir d'une page HTML statique?

<input id="profile_skills_attributes_0_id" name="profile[skills_attributes][0][id]" type="hidden" value="3" /> 

Une idée ou une solution de contournement? Merci

Répondre

0

fields_for crée un tableau de champs. Le "0" dans le nom représente l'index dans le tableau. Puisque vous créez de nouveaux enregistrements, vous pouvez simplement ignorer le champ d'ID caché. Donc, via javascript, il suffit de faire deux choses: 1. Comptez le nombre d'entrées existantes pour la collection enfant afin d'obtenir un nouvel index. 2. Ajoutez un nouveau champ de texte en utilisant le nouvel index. Ceci est relativement facile à faire avec jQuery en utilisant un sélecteur générique comme $ ('input [nom $ = "] [nom]"]'). Length; pour récupérer un nombre (pour le nouvel index). Si vous avez un autre champ pour array avec des champs de noms, vous pouvez utiliser un sélecteur regex à la place (via le plugin). Un moyen plus simple pourrait être d'ajouter simplement une classe à chacune de vos entrées de nom de compétence et d'utiliser cette classe comme sélecteur lors du comptage.

Pour ajouter le nouveau voir d'entrée:

http://api.jquery.com/append/

Si vous ne l'utilisez jquery, alors il devrait être similaire dans d'autres cadres avec un peu googler.

+0

Merci beaucoup ... Je l'ai fait à partir de votre suggestion – Joe

1

J'ai écrit une gemme qui peut gérer qui rend la manipulation des formulaires imbriqués plus facilement: cocoon. La gemme fonctionne avec les rails formhelpers standard, mais aussi avec formtastic ou simple_form.

Je vous conseille également de vérifier formtastic ou simple_form, car ce sont des gemmes impressionnantes pour faciliter la manipulation des formulaires. Mais comme avec HAML, c'est un choix personnel.

Questions connexes