我已经实现了一个在我的Ruby on Rails应用程序中使用ajax更新的上/下投票系统。按钮调用create方法,将投票插入数据库,并计算投票金额。
然而,截至目前,用户可以按照自己的意愿进行多次投票或投票。我希望投票能像我们在StackOverflow上看到的那样,用户只能投票或投票一次,投票可以撤消。我如何为此构建逻辑?
答案 0 :(得分:1)
我推荐acts_as_rateable宝石,这是我一直用于多个网站的这种要求。这项工作完美无缺。
如果你想自己实现这个,你的Rating
模型应该有一个user_id
并且是多态的,以便将自己附加到你想要评价的任何模型上。然后,您可以简单地编写AJAX控制器代码以拒绝重复投票。在前端,应该实现从现有upvote / downvote中删除链接功能的Javascript,以实现良好的用户体验。
答案 1 :(得分:0)
我认为你还有一些工作要做。您应该在模型中添加问题和用户之间的多对多关系,您可以在其中记住哪个用户投票选择了哪个问题以及以何种方式(向上或向下)投票。之后,当您在屏幕上呈现问题时,您应该从该表中选择当前用户与所显示问题相关的投票。
当用户对某个问题进行投票时,您应该将记录添加到相应的表中。此外,在显示问题时,如果用户已经upvoted(downvoted),那么您应该相应地设置upvote(downvote)链接的样式。如果用户再次尝试投票,如果用户已经投票,您可以在数据库中注册投票之前进行检查。
也许这不是执行此类操作的最快方式,但它可以让您获得最大的控制权(您可以稍后显示有关特定用户的投票方式,投票日期和时间的详细统计信息,你可以限制用户每天可以投票的数量,等等......)
答案 2 :(得分:0)
class Vote < ActiveRecord::Base
belongs_to :question
belongs_to :user
validates_uniqueness_of :user_id, :scope=>question_id
end
http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086
如果您尝试多次投票,您的控制器将返回错误。如果您投票支持投票,请让UI删除投票。