Запрет пользователям голосовать несколько раз в Rails - PullRequest
2 голосов
/ 23 января 2010

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

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

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

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

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

Senthil

Ответы [ 2 ]

1 голос
/ 23 января 2010

Один из способов сделать это - иметь модель 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 часа).

1 голос
/ 23 января 2010

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

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

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

...