2009-01-16 15 views
1

Jusqu'à présent, je n'ai pas réussi à trouver une solution permettant à un formulaire d'interagir avec deux modèles ayant une relation un-à-plusieurs. Dites par exemple, un client a beaucoup d'articles.Méthode REST pour effectuer plusieurs modèles dégradables dans un formulaire dans Rails

Actuellement, j'ai implémenté des solutions utilisant Javascript qui permettent aux utilisateurs d'ajouter/supprimer des lignes à la liste d'éléments. Restons simple, nous créons de nouveaux records ici. En améliorant cela pour être dégradable, j'ai plutôt créé un bouton 'Ajouter un élément' qui valide une valeur différente, de sorte que dans mon action de création, je suis capable de capturer les nouveaux attributs et d'ajouter un nouvel élément à l'objet client.

Cependant, comme l'élément est nouveau et n'a pas d'identifiant, je n'ai aucun moyen de supprimer un élément particulier. J'ai pensé à utiliser des index et ajouté des boutons/liens post à supprimer, mais cela rend tout désordonné et je ne peux pas utiliser mon partiel pour les collections. Donc j'ai l'impression que c'est un hack; Y a-t-il une meilleure alternative?

+0

J'ai moi-même eu des difficultés avec cela, donc je suis intéressé de voir si quelqu'un a une solution. Il semble que les choses pourraient s'améliorer dans les futures versions (voir http://tr.im/99v7), mais les formes de modèles imbriquées sont un point faible de Rails en ce qui me concerne. – maxhawkins

+0

Cela ressemble à ce dont nous aurons besoin! Bonne trouvaille! – Jaryl

Répondre

1

Vous souhaitez utiliser accept_nested_attributes_for. Les mentions de l'épisode Railscasts henrikloevborg couvrent une méthode de faire ce genre de chose qui a été rendu obsolète par accept_nested_attributes_for.

Vous pouvez le faire sans accept_nested_attributes_for. Ce qui peut être nécessaire si vous ne voulez pas passer à Rails 2.3.

Dans votre javascript pour supprimer un élément, vous devez ajouter un champ masqué au formulaire appelé _delete avec la valeur true. Ensuite dans votre contrôleur. Ignorez les nouveaux enregistrements avec le champ _delete et détruisez ceux qui existent déjà.

Tout ce qui est construit pour accept_nested_attributes_for

Jouez avec le code dans le référentiel complex-forms-exmample github. C'est essentiellement le code de Railscast # 75 mis à jour pour utiliser la nouvelle fonctionnalité, accepted_nested_attributes_for.

Vous remarquerez qu'il n'utilise pas RJS pour effectuer l'ajout/suppression dynamique d'enregistrements. Aussi comparé à ce que vous avez fait, il crée sur soumettre, pas pendant un appel à distance. L'ajout/la suppression automatique d'éléments est géré en utilisant des balises content_for pour créer un modèle stocké dans une fonction javascript et la bibliothèque Prototype pour modifier un champ masqué, qui accepte les attributs_nested_for pour détruire les objets que vous souhaitez supprimer.

+0

Oui, je sais que les nouvelles fonctionnalités rendent cela possible. Je suppose que je dois vous marquer comme la bonne réponse de toute façon =) – Jaryl

+0

Le javascript contenu dans l'exemple complex-forms est un peu un hack, mais ne se sent pas comme ça avec toutes les méthodes d'aide pour le streamer en ligne. – EmFi

1

railscasts episode #75 est à ce sujet, si je comprends bien votre question.

Je crois qu'il crée les éléments, puis les marque pour la suppression si l'utilisateur regrette de les créer.

Ceci est la meilleure façon de gérer le problème et il existe des conseils pour gérer les validations.

+0

Je l'ai déjà vu, mais il utilise RJS pour ajouter/supprimer les éléments. – Jaryl