Создайте метод в модели 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]} }