我正在使用Merit gem为我的应用程序为已登录的用户添加信誉系统。
这是我使用score
处理投票的示例:
def initialize
score 5, on: 'posts#upvote', to: :user
score -5, on: 'posts#downvote', to: :user
score 1, on: 'posts#upvote', to: :itself
score -1, on: 'posts#downvote', to: :itself
end
问题在于,使用此解决方案,用户可以根据需要多次对帖子进行投票。我希望用户每篇文章只有一票。有没有办法阻止用户多次投票?
答案 0 :(得分:0)
您可以将块传递给score
以确定是否允许。有关详细信息,请参阅Merit: Defining Rules。
此代码会更新您提供的内容,以便举例说明如何在您的应用中实现它:
def initialize
score 5, on: 'posts#upvote', to: :user {|topic| topic.voted?(@user) }
score -5, on: 'posts#downvote', to: :user {|topic| topic.voted?(@user) }
score 1, on: 'posts#upvote', to: :itself {|topic| topic.voted?(@user) }
score -1, on: 'posts#downvote', to: :itself {|topic| topic.voted?(@user) }
end
这假定您已经(或可以构建)一种方法来确定用户是否已经对某个主题进行了投票。在这种情况下,对于您允许投票的主题,该方法为voted?
。
如果您想允许用户只投票一次,但要反转先前的投票(如SO允许),您也可以在块中处理。在块中评估的条件的复杂性完全取决于您。