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?
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
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