2011-03-04 3 views
0

J'ai un modèle d'album qui a une association "has_many: trough" nommée Track. Fondamentalement, un album peut avoir un certain nombre de pistes, mais une piste peut appartenir à plus d'un album en même temps (d'où l'association "Tracklist").Rails 3 accepte_nested_attributes_for formulaire pour le nouveau modèle (au lieu de la collection complète)

J'ai une application RESTful avec une forme (avec l'aide de formtastic) qui met tous les attributs de pistes comme si

form.semantic_fields_for :tracks do | builder | 
    builder.fields 
end 

Le formulaire met tous les champs de pistes associées et je peux les mettre à jour bien, tout fonctionne. Maintenant, ce que je veux faire est d'avoir une autre vue pour ajouter une nouvelle piste à un album existant. Dans cette vue, je ne veux pas rendre tous les champs d'entrée pour les pistes existantes, mais seulement les champs pour la nouvelle association que j'essaie de créer.

J'ai essayé de trouver des informations sur la façon de faire, et le meilleur que je suis venu avec est:

form.semantic_fields_for :tracks, Track.new do | builder | 
    builder.fields 
end 

Ceci produit un ensemble d'entrées piste, comme nécessaire, et je peux soumettre le formulaire et la piste sont créés et associés au produit - mais seulement s'il n'y a pas d'erreurs de validation.

Le problème vient avec les validations. Si on échoue, l'application rend le même point de vue nouveau, mais toutes les entrées sont vides à nouveau (toutes les données, valides ou non, est perdu, et les messages d'erreur en ligne pour Formtastic ont également disparu):

form.semantic_fields_for :tracks, Track.new do | builder | 
     builder.fields 
end 

I reckon c'est parce que je fais un Track.new même s'il y a déjà un objet dans les paramètres de requête qui a les messages de données et d'erreur. Ce n'est pas bon, bien sûr. Ce que je veux avoir, c'est le formulaire pour la seule piste affichée avec les données déjà entrées, ainsi que les messages d'erreur Formtastic.

Qu'est-ce que je fais mal?

Répondre

0

Au lieu de

Track.new 

vous avez besoin de mettre en place

@track = @album.tracks.build 

dans votre contrôleur et l'utiliser. Cela devrait préserver les champs à travers les erreurs de validation.

0

J'ai trouvé une solution. Cela fonctionne, mais je me demande si c'est une bonne solution. Merci Srdjan de m'avoir mis sur la bonne voie!

@track = @album.tracks.build 

form.semantic_fields_for :tracks, @track do | builder | 
    builder.fields if builder.object.new_record? 
end 

Apparemment, seuls les champs de formulaire du nouvel enregistrement sont rendus.

Questions connexes