Обновление голосования по Ruby on Rails - PullRequest
3 голосов
/ 04 сентября 2010

Сейчас я нахожусь в процессе разработки приложения для социальных сетей на Ruby on Rails, я внедрил систему голосования из 5 пунктов. Где вы можете проголосовать за новости, размещенные на сайте с 1 по 5, я хотел бы знать следующее: как лучше всего обрабатывать обновления в системе голосования.

В примере. Если пользователь уже проголосовал в статье, я хотел бы вернуть счет, который он дал в этой статье, и мягко заблокировать голосование (так как я разрешаю только 1 голос на пользователя и я могу изменить ваш голос в любое время), но если у него нету я приведу статью с голосования на 0.

Я знаю способ сделать это, я мог бы сделать это в представлении, и проверить, если текущий пользователь уже проголосовал по этой статье, я бы отправил их в представление РЕДАКТИРОВАТЬ в противном случае в представление ПОКАЗАТЬ. (Я думаю)

В любом случае, каков был бы «правильный» подход к этому?

РЕДАКТИРОВАТЬ: я забыл сказать, что поле со списком для голосования это частичное, что я рендеринг. Должен ли я как-то просто обновить частичное?

РЕДАКТИРОВАТЬ2:

class Article < ActiveRecord::Base

  has_many :votes
  belongs_to :user

  named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?",  user]}  }
end

class User < ActiveRecord::Base
  has_many :articles
  has_many :votes, :dependent => :destroy

  def can_vote_on?(article)
    Article.voted_by(current_user).include?(article) #Article.voted_by(@user).include?(article)
  end

end

1 Ответ

1 голос
/ 04 сентября 2010

Создайте метод в модели User, который отвечает true, если пользователь может голосовать за статью:

class User < ActiveRecord::Base

...

def can_vote_on?(article)
  articles_voted_on.include?(article) # left as an exercise for the reader...
end

end

В представлении, визуализируйте форму, если пользователь может редактировать, иначе визуализируйте обычныйview:

<% if @user.can_vote_on?(@article) %>
  <%= render :partial => "vote_form" %>
<% else %>
  <%= render :partial => "vote_display" %>
<% end %>

Или вы можете обработать все это в контроллере и отобразить отдельные шаблоны для версии формы и обычной версии.Лучший подход зависит от особенностей вашей ситуации.

EDIT2

Как вы обнаружили, current_user не работает в модели.Это имеет смысл, потому что он может быть вызван из миграций, библиотек и т. Д., Где нет понятия сеанса.

Нет необходимости обращаться к текущему пользователю в любом случае, поскольку ваш метод экземпляра (по определениювызываться по инстанции.Просто обратитесь к self в модели и вызовите метод из представления на current_user, который является экземпляром User:

(в модели)

  def can_vote_on?(article)
    Article.voted_by(self).include?(article)
  end

(в представлении)

<% if current_user.can_vote_on?(@article) %>

Или вы можете заменить @user на current_user, если контроллер назначит его.

И последнее, я думаю, ваша именованная область должна использовать user.idвот так:

named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?",  user.id]}  }
...