2010-09-20 7 views
0

J'ai une liste des 'intérêts' que chaque utilisateur de mon système peut évaluer. Un administrateur peut ajouter/supprimer des intérêts à tout moment. Lorsque l'utilisateur va éditer son compte, je veux montrer une liste de tous les intérêts dans le système, et une liste déroulante avec une valeur de 1..5. Je me demande comment je l'ai mis en place ..Eléments imbriqués statiques dans les rails

Utiliser accept_nested_attributes pour ne semble pas fonctionner parce que quand j'utilise un champ_pour cela veut créer le formulaire pour chacun des intérêts qui ont été sauvegardés. Ce que je veux, c'est que chacun des intérêts apparaisse, et à l'enregistrement, si l'utilisateur a évalué l'intérêt auparavant, il met à jour la valeur, s'il n'a pas été évalué auparavant, puis ajoute une nouvelle entrée.

Actuellement utilisateur:

has_many :user_interests, :dependent => :destroy 
    has_many :interests, :through => :user_interests, :foreign_key => :user_id 

    accepts_nested_attributes_for :user_interests 

Actuellement UserInterest:

belongs_to :user 
    belongs_to :interest 

actuellement un intérêt:

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

Répondre

0

J'ai fini en feuilletant les boucles, il a été en boucle par les intérêts d'abord, puis la création de l'élément de formulaire pour chacun.

<% Interest.all.group_by(&:interest_category).each do |category, interests| %> 
    <p> 
     <h4 id="interests"><%= category.title %></h4> 
     <ul> 
      <% interests.each do |interest| %> 
      <% user_interest = @current_user.user_interests.find_by_interest_id(interest) || @current_user.user_interests.new(:interest_id => interest.id) %> 
       <% form.fields_for "user_interests[#{interest.id}]", user_interest do |user_interests_form| %> 
        <li><%= user_interests_form.select :rating, options_for_select([1, 2, 3, 4, 5], user_interest.rating || ""), {:prompt => "-- Select One --"} %> <%= interest.title %></li> 
       <% end %> 
      <% end %> 
     </ul> 
    </p> 
    <% end %> 

Et de créer un paramètre personnalisé pour les intérêts après la soumission du formulaire.

def user_interests=(interests) 
    interests.each do |interest| 
     interest_id = interest[0] 
     rating = interest[1]["rating"] 

     # confirm that a rating was selected 
     if rating.to_i > 0 
     # see if this user has rated this interest before 
     int = self.user_interests.find_by_interest_id(interest_id) 

     # if not, build a new user_interest for this interest 
     int = self.user_interests.build(:interest_id => interest_id) if int.nil? 

     # set the rating 
     int.rating = rating 

     # save the new user_interest, or update the existing one 
     int.save 
     end 
    end 
    end