Жемчужина заслуг - запретите пользователям голосовать более одного раза
Я использую Gem Merit, чтобы добавить систему репутации в свое приложение для пользователей, которые вошли в систему.
Это пример того, как я использую 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
Проблема в том, что с этим решением пользователи могут голосовать за сообщения столько раз, сколько они захотят. Я хотел бы, чтобы пользователи имели только один голос за пост. Есть ли способ запретить пользователям голосовать несколько раз?
1 ответ
Вы можете передать блок score
определить, следует ли это разрешить или нет. См. Достоинство: определение правил для получения дополнительной информации.
Этот код обновляет то, что вы предоставили, чтобы дать пример того, как вы могли бы реализовать его в своем приложении:
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), вы также можете обработать это в блоке. Сложность оцениваемого состояния в блоке полностью зависит от вас.