Статические вложенные элементы в Rails - PullRequest
0 голосов
/ 20 сентября 2010

У меня есть список «Интересов», которые каждый пользователь в моей системе может оценивать. Администратор может добавлять / удалять интересы в любое время. Когда пользователь идет редактировать свою учетную запись, я хочу показать список всех интересов в системе и раскрывающийся список со значением 1..5. Мне интересно, как я это настроил ..

Использование acceptpts_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

1 Ответ

0 голосов
/ 26 сентября 2010

В итоге я просто перевернул циклы, поэтому сначала он просматривал интересы, а затем создавал элемент формы для каждого.

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