Запретить пользователям голосовать несколько раз в Rails

У меня есть простая настройка системы рейтинга в модели блога. Я использую пользовательский метод для повышения рейтинга, который является целым числом в базе данных блога.

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

Прямо сейчас я могу голосовать столько раз, сколько захочу, что, конечно же, ведет к катастрофе. Пользователи могут голосовать несколько раз и увеличивать количество голосов.

Как мне сделать так, чтобы кнопка отправки голоса исчезала после ее отправки один раз. Я думал сделать отдельную модель для рейтинга и использовать собственный токен, но это кажется излишне сложным для простого приложения.

Любая помощь?

Сентил


person sent-hil    schedule 23.01.2010    source источник


Ответы (2)


Один из способов сделать это — использовать модель Post и модель RatedPost. Модель RatedPost может содержать такую ​​информацию, как incremented:boolean, decremented:boolean, changed_by:integer (user_id), post_id:integer.

Затем вы можете определить, возвращает ли RatedPost.find_by_post_id_and_changed_by(post.id, user.id) какие-либо записи.

Вы также можете определить, были ли точки увеличены или уменьшены. Таким образом, вы можете позволить пользователю изменять свой голос в течение определенного периода времени (скажем, 24 часа).

person Sid    schedule 23.01.2010

Вам либо нужно вести список пользователей, которые голосуют за определенную тему/сообщение, либо вам нужно прикрепить к каждому пользователю список, содержащий сообщения, за которые проголосовал пользователь. Храните ли вы информацию вместе с сообщениями или пользователями, это ваш выбор и, вероятно, зависит от требований вашего приложения.

При отображении страницы, содержащей кнопку голосования, вы должны проверить, проголосовали ли уже current_user или нет. И не показывать кнопку, если голос уже был подан. Из соображений безопасности вы можете также проверить, проголосовал ли пользователь в коде, который вы показали выше, чтобы предотвратить голосование без использования кнопки.

Если вы также позволите людям, которые не вошли в систему, голосовать, вам нужно будет сохранить их IP-адрес или что-то в этом роде.

person Veger    schedule 23.01.2010