防止用户在Rails中多次投票

时间:2010-01-23 11:08:52

标签: ruby-on-rails rating

我在博客模型中设置了一个简单的评级系统。我使用自定义方法来提高评级,这在博客db中是整数。

def increase
  @post = Post.find(params[:id]).increment!(:rating)
  if logged_in?
    current_user.increment!(:votes)
  end
  flash[:notice] = "Thanks for rating"
  redirect_to posts_url
end

现在,我可以根据需要多次投票,这当然是一场灾难。用户可以多次投票并推动计数方式。

我如何制作,以便在提交一次后投票提交按钮消失。我想过制作一个单独的模型进行评级并使用自定义令牌,但对于一个简单的应用程序来说似乎不必要的复杂。

任何帮助?

塞特希

2 个答案:

答案 0 :(得分:1)

您需要为在特定主题/帖子上投票的用户保留一个列表,或者您需要为包含用户投票的帖子的每个用户保留一个列表。您是否将信息与帖子或用户一起存储是您的选择,可能取决于您的应用程序要求。

当显示包含投票按钮的页面时,您必须检查current_user是否已经投票。如果投票已经投出,请不要显示按钮。出于安全原因,您可能还想检查用户是否使用上面显示的代码进行投票,以防止在不使用按钮的情况下进行投票。

如果您还允许未登录的人投票,则需要存储他们的IP地址或其他内容。

答案 1 :(得分:1)

这样做的一种方法是使用Post模型和RatedPost模型。该 RatedPost模型可能包含类似的信息        incremented:booleandecremented:booleanchanged_by:integer (user_id)post_id:integer

然后,您可以确定RatedPost.find_by_post_id_and_changed_by(post.id, user.id)是否返回任何记录。

您还可以识别点数是递增还是递减。因此,您可以允许用户在一段时间内(例如24小时)更改投票。