2010-09-20 76 views
0

我有一个“兴趣”列表,表示我的系统中的每个用户都有能力评分。管理员可以随时添加/删除兴趣。当用户去编辑他们的帐户时,我想要显示系统中所有兴趣的列表,并以1..5的值显示下拉列表。我想知道如何设置它..导轨中的静态嵌套元素

使用accep_nested_attributes似乎并没有工作,因为当我使用field_for它想要为每个已保存的兴趣创建表单。我想要的是每个兴趣都显示出来,如果用户之前对兴趣进行了评级,则会更新该值,如果尚未评估过,则添加一个新条目。

目前用户:

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

    accepts_nested_attributes_for :user_interests 

目前一个使用者兴趣:

belongs_to :user 
    belongs_to :interest 

目前的兴趣:

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

回答

0

我最终只是翻转的循环,所以它是通过循环首先是利益,然后为每个创建表单元素。

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

然后在表单提交后为感兴趣的用户创建一个自定义设置器。

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