2010-09-15 3 views
4

Lisez la grande mise à jour pour les dernières informations.Utilisez accept_nested_attributes_for pour créer de nouveaux enregistrements ou mettre à jour

Salut tout le monde,

J'ai un grand nombre à plusieurs dans une application de rails qui comporte trois tables: une table utilisateur, une table d'intérêts, et une jointure table user_interests qui a également une valeur de notation Ainsi, un utilisateur peut évaluer chacun de ses intérêts sur une échelle de 1 à 10.

Je cherche essentiellement un moyen pour un nouvel utilisateur de créer sa note quand ils l'inscrivent et les éditent à une date ultérieure avec n'importe quelle information de leur profil en même temps.

J'ai essayé de suivre cette question Rails nested form with has_many :through, how to edit attributes of join model? mais le problème que j'ai est d'essayer d'incorporer une liste de sélection dans le mélange et ayant de multiples intérêts à évaluer pour l'utilisateur.

Code de modèle:

user.rb 
has_many :user_interests, :dependent => :destroy 
has_many :interests, :through => :user_interests, :foreign_key => :user_id 
accepts_nested_attributes_for :user_interests 

interest.rb 
has_many :user_interests, :dependent => :destroy 
has_many :users, :through => :user_interests, :foreign_key => :interest_id, :dependent => :destroy 

user_interest.rb 
belongs_to :user 
belongs_to :interest 

Afficher le code:

app/views/user/_form.html.erb 
<%= form_for(@user) do |form| %> 
    ... user fields 
    <%= form.fields_for :user_interests do |ui_form| %> 
    ... loop through ALL interests 
    <% Interest.all.each do |interest| %> 
     <%= ui_form.select :rating, options_for_select(1..10) %> 
     <%= ui_form.hidden_field :interest_id, :value => interest.id %> 
    <% end %> 
    <% end %> 
<% end %> 

J'ai aussi inclus ce qui suit dans les nouvelles/actions de modifier dans mon contrôleur @user.interests.build.build_interest

Le problème que je suis en cours d'exécution dans est-ce qu'une seule note d'intérêt est passée dans le hachage params quand je veux avoir plusieurs. De plus, je reçois une exception levée par des rails

Interest(#2172840620) expected, got Array(#2148226700) 

Quel petit détail ne me manque ou vous méprenez pas qui est l'origine du problème?

EDIT:

J'ai trouvé un moyen de forcer cela fonctionne, mais il doit être modifié manuellement le HTML dans les outils de développement de chrome, l': attribut nom de mes éléments de formulaire sont générées en user[user_interests_attributes][rating] mais si je change à user[user_interests_attributes][][rating] cela fonctionnera quand je mettrai à jour un enregistrement. Cependant, je ne peux pas spécifier manuellement le: nom d'un élément de formulaire lié à un objet de formulaire. Alors, que puis-je faire pour montrer que des taux d'intérêt multiples sont passés au lieu d'un seul que les rails pense?

BIG mise à jour:

Hé les gars, je suis une version semi-fonctionnelle va avec quelques légères modifications:

Code Voir:

<% form.fields_for :user_interests do |ui_form| %> 
<p> 
    <%= ui_form.select :rating, options_for_select(1..5), :selected => :rating %> 
    <%= ui_form.label :interest_title %> 
    <%= ui_form.hidden_field :interest_id %> 
</p> 
<% end %> 

Code Controller:

def new 
    @user = User.new 
    Interest.all.each { |int| @user.user_interests.build({ :interest_id => int.id }) } 
end 

def edit 
    @user = @current_user 
    Interest.unrated_by_user_id(@user.id).each { |int| @user.user_interests.build({ :interest_id => int.id }) } 
end 

Maintenant, je suis en mesure d'éditer et de mettre mes user_interests à jour ou créés si aucune évaluation exi sts, mais j'obtiens une erreur que l'utilisateur est vide lorsque j'essaye de créer un nouvel utilisateur. De plus, je ne peux accéder à aucun des attributs d'intérêt dans le formulaire pour afficher l'intérêt que l'utilisateur est réellement évalué. Quelqu'un peut-il aider avec ces mises en garde?

Répondre

3

Vous avez seulement besoin de @user.interests.build parce que c'est une relation has_many. build_interest est pour quand il y a une relation has_one/belongs_to.Lorsque vous utilisez fields_for :user_interests lorsque vous utilisez fields_for :user_interests, vous indiquez au modèle User qu'une instance d'un ou plusieurs objets user_interest figure dans le hachage des paramètres lorsque l'utilisateur est créé/mis à jour. Le formulaire ne crée ou ne met pas à jour les user_interests, mais il renvoie un tableau de hachages user_interest_attributes représentant les interets utilisateur pour l'utilisateur référencé par le formulaire. Il s'agit d'un tableau de valeurs d'évaluation user_interests pour lesquelles aucun interet_utilisateur n'existe car vous les référencez dans le formulaire qui est la raison pour laquelle vous obtenez l'erreur.

Étant donné que vous transmettez une plage à l'aide de formulaire select, vous ne proposez aucun intérêt pour le formulaire. La sélection définira une valeur pour la colonne de notation dans la table user_interests avec une valeur comprise entre 1 et 10. Il n'y a pas d'intérêt_utilisateur pour que la classification soit définie même si la table user_interests a une colonne de classification.

en passant le :multiple => true dans les options hash de la balise select va créer une liste de sélection multiple mais je ne pense pas que ce soit ce que vous voulez. Je pense que vous voulez de nombreux éléments sur une page sur laquelle l'utilisateur peut mettre une note d'intérêt.

Si vous ne voulez qu'un utilisateur soit en mesure de choisir de nombreux intérêts c'est comment utiliser fields_for avec accepts_nested_attributes_for sur une relation has_many :through:

<%= form_for(@user) do |f| %> 
    <% f.fields_for :interest_ids do |interest| %> 
    <ul> 
     <% Interest.all.each do |choice,i| %> 
     <li class="selection"> 
     <%= interest.check_box [], { :checked => f.object.user_interest_ids.include?(choice.id) }, choice.id, '' %> 
     <%= interest.label [], choice.name %> 
     </li> 
    <% end %> 
    </ul> 
    <% end %> 
<% end %> 
+0

Je travaille sur ce maintenant, on dirait que je suis parti ma boucle de tous les intérêts à mon avis sur mes échantillons de code ci-dessus, je vais le modifier pour refléter ce que j'avais à l'origine peut-être jeter un peu de lumière – Jimmy

+0

Ouais je ne cherche pas à avoir des coches pour chaque intérêt, mais une liste déroulante valeur d'évaluation pour chaque intérêt – Jimmy

Questions connexes