Жемчужина заслуг - запретите пользователям голосовать более одного раза

Я использую 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), вы также можете обработать это в блоке. Сложность оцениваемого состояния в блоке полностью зависит от вас.

Другие вопросы по тегам