Pour simplifier les choses, j'ai 3 tables:Ruby on Rails - Sauvegarde et mise à jour d'un attribut dans une table de jointure avec a beaucoup => par
Personne
has_many: capacités, à travers =>: stats
Capacité
has_many: les gens, à travers =>: Statistiques
Statistiques
belongs_to: personnes
belongs_to: capacités
Stats a un attribut supplémentaire appelé 'qualification'. Ce que je voudrais faire est de faire un formulaire d'édition de personne qui énumère toujours toutes les capacités actuellement dans la base de données, et me laisse attribuer une évaluation.
Pour la vie de moi, je ne peux pas comprendre comment faire ceci. J'ai réussi à le faire fonctionner lors de la création d'un nouvel utilisateur avec quelque chose comme ceci:
(du contrôleur de personnes)
def new
@character = Character.new
@abilities = Ability.all
@abilities.each do |ability|
@person.stats.build(:ability_id => ability.id)
end
end
From the people form:
<% for @ability in @abilities do %>
<%= fields_for "person[stats_attributes]" do |t| %>
<div class="field">
<%= t.label @ability.name %>
<%= t.hidden_field :ability_id, :value => @ability.id, :index => nil %>
<%= t.text_field :rating, :index => nil %>
</div>
<% end %>
<% end %>
Cela me donne avec succès une liste des capacités avec des boîtes de notation à côté d'eux, et permet de les enregistrer si je fais un nouvel utilisateur. Le problème est que si je charge ensuite le formulaire d'édition (en utilisant le même formulaire partiel), il ne ramène pas les évaluations, et si je sauvegarde, même avec exactement les mêmes évaluations, il crée des entrées en double dans la table de statistiques, au lieu de la mettre à jour. Je réalise que je suis un mauvais programmeur et je le fais probablement dans le mauvais sens, mais comment puis-je obtenir le formulaire d'édition pour rappeler les évaluations actuelles attribuées à chaque capacité pour cet utilisateur, et deuxièmement comment puis-je obtenir -il mettre à jour la notation au lieu de la dupliquer si la combinaison de personne et de capacité existe déjà?