0

Je travaille sur notre webapp et la semaine dernière, ma tâche incluait l'implémentation d'un formulaire imbriqué doté d'une fonctionnalité de suppression d'ajout dynamique de champs (à partir du modèle enfant associé). Notez que la forme implémente deux modèles avec une relation un à plusieurs. J'ai fait des recherches sur ce sujet et découvert différentes façons, certaines d'entre elles ajoutent/suppriment des champs without js, où d'autres utilisent js à l'ancienne (rails 3 ou avant). J'ai suivi railscast-196 et railscast-197, mais la méthode d'assistance expliquée n'est pas discrète façon, non? (car il utilise encore js dans le html)Rails: Utilisation avancée de FormBuilder

Je cherche un moyen de mettre en œuvre la fonctionnalité d'ajout/suppression par jquery d'une manière discrète.

Logiquement, il devrait être possible grâce à - Faire une demande de paiement ajax construire une instance du modèle imbriqué, - répondre en construisant à côté serveur via jquery, - mise à jour de la vue et - l'envoi de la vue mise à jour en arrière au client.

Problèmes: - Le problème auquel je fais face est de passer l'objet builder à la jquery. Attente: - Reliure deux ajouter et de supprimer la fonction personnalisée de champ aux boutons en vue à travers jquery

plus: Pourriez-vous s'il vous plaît me donner un lien vers un plus dans la documentation de la profondeur à FormBuilder? Cause rubyonrails api n'explique pas assez. Ils ne disent même pas que si vous utilisez form_builder.object, vous obtiendrez le modèle (explicitement), avec l'utilisation de formBuilder par ryanb "f.object.class.reflect_on_association".

+0

Vous n'avez pas besoin de passer l'objet builder à JQ, vous utilisez Javascript pour charger partiellement, ce qui est du HTML lorsque les rails répondent à la requête du navigateur –

+0

Joe Half Face: Qu'en est-il de la suppression d'un champ déjà existant? – cjmj

Répondre

-1

Il y a un petit bijou qui fait expactly ce que vous essayez de mettre en œuvre: https://github.com/nathanvda/cocoon

Si vous voulez faire voici manuellement le plan:

  1. Vous n'avez pas besoin d'envoyer la demande AJAX pour construire des instances de modèles imbriqués (Qu'est-ce qui se passe, lorsque l'utilisateur clique bouton ajouter un nouveau instance et ferme l'onglet du navigateur l'instance restera dans DB?)

  2. utiliser la pleine puissance de Rails' nested attributes - il vous permet de créer modèles parent et enfants en un seul mouvement, dans un create ou save appel sur le modèle parent.

  3. Tout ce que vous avez à faire dans JS est de créer 2 boutons, un qui ajoute de nouveaux champs, d'autres qui les supprime. Juste HTML, pas d'appels AJAX.

  4. Pour utiliser des attributs imbriqués, vous devez respecter certaines conventions lors de la création de paramètres pour Parent.create ou save. Généralement, lorsque vous créez un modèle, vous transmettez des attributs à la méthode create, ces attributs correspondent aux champs du modèle. Lorsque vous utilisez des attributs imbriqués, vous devez passer un attribut supplémentaire, qui est formé de la manière suivante: [children_relation_name]_attributes. Donc, si vous avez le modèle Project et Task et que vous voulez créer un projet et des tâches simultanément, vous devez les créer comme suit:

    Projet.créer (nom: 'Projet 1', tasks_attributes: [{name: 'Tâche 1'}, {name: 'Tâche 2'}])

(esprit pas ids pour des tâches - Rails les affecter automatiquement)

  1. Tous les travaux ci-dessus que si le modèle Parent a has_many :children et accepts_nested_attributes_for :children

  2. Ainsi, votre tâche est juste de construire params correct qui incluent children_attributes param, ajoutez param à paramètres forts (comme si children_attributes: [:name, :age, ...]). Vous utilisez form_for et fields_for pour construire le formulaire, JS pour mettre correctement les champs dans ce formulaire, les attributs imbriqués pour créer des enregistrements parent et enfants simultanément. Et c'est ce que fait la gemme cocoon.

Comme pour la documentation de Rails, c'est assez bon et surtout complet. Oui, personne n'est parfait et il peut y avoir des lacunes, mais il n'y a rien de mieux que cette documentation. Vous pouvez également vous référer au code Rails, mais il est beaucoup plus difficile que de lire la documentation.

+0

Tant d'efforts pour obtenir un vote «-1»: o: / – Aleks