2010-09-20 55 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