我有活跃的唱片声誉系统,但是一旦用户投票,我似乎无法隐藏投票按钮。
在user.rb中的我有一个投票方法
has_many :evaluations, class_name: "RSEvaluation", as: :source
def voted_for?(review)
evaluations.where(target_type: review.class, target_id: review.id).present?
end
然后在评论节目页面中我有以下代码,如果'if'语句评估为真,则隐藏按钮
<% if User.find(session[:user_id]) &&
!User.find(session[:user_id]).voted_for(@review)%>
<h3> Vote:
<%= link_to "Up", vote_review_path(@review, type: "up"), method: "post" %>
||
<%= link_to "Down", vote_review_path(@review, type: "down"), method: "post" %></h3>
<% end %>
按钮仍会显示。我一直关注railscast,在那个视频中他们使用了current_user但是我使用User.find(session [:user_id])来识别用户(current_user没有定义,我总是得到错误“* undefined local variable或方法`current_user'*“
答案 0 :(得分:1)
添加到您的application_helper.rb:
def current_user
@current_user ||= User.find(session[:user_id])
end
def logged_in?
!!current_user
end
现在,您可以在视图中使用current_user
和logged_in?
。
<% if logged_in? && !current_user.voted_for?(@review)%>
<h3> Vote:
<%= link_to "Up", vote_review_path(@review, type: "up"), method: "post" %>
||
<%= link_to "Down", vote_review_path(@review, type: "down"), method: "post" %></h3>
<% end %>
def voted_for?(review)
evaluations.where(target_type: review.class, target_id: review.id).count > 0
end
答案 1 :(得分:0)
如果您的评论课有
has_reputation :votes, source: :user, aggregated_by: :sum
您可以使用
获得所有评估(声誉记录)object.evaluations
因此,要确定是否有某些投票,特定用户可以使用
class Review
def was_vouted_by? user
self.evaluations.find_by_source_id(user.id)
end
end
find_by_source_id - 将返回记录,其中ruby评估为true,或 nil ,ruby评估为false