ruby - 活跃记录声誉系统(隐藏投票按钮)

时间:2013-04-05 14:00:12

标签: ruby ruby-on-rails-3 activerecord

我有活跃的唱片声誉系统,但是一旦用户投票,我似乎无法隐藏投票按钮。

在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'*“

2 个答案:

答案 0 :(得分:1)

添加到您的application_helper.rb:

def current_user
  @current_user ||= User.find(session[:user_id])
end

def logged_in?
  !!current_user
end

现在,您可以在视图中使用current_userlogged_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