Ограничить голосование с помощью куки - PullRequest
0 голосов
/ 10 октября 2011

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

Контроллер https://gist.github.com/1274274

Просмотр https://gist.github.com/1274275

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Я бы не стал хранить это в куки или даже в сессии.Вы должны отслеживать их в таблице votes, которая содержит user_id и link_id.

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

0 голосов
/ 10 октября 2011

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

Я бы изменил ваш контроллер следующим образом:

def up
    @link = Link.find(params[:id])

    session[:voting] ||= {}

    unless session[:voting][@link.id]
        if session[:voting][@link.id].nil?
            points = 1
        else
            points = 2

        @link.update_attribute :points, @link.points + points

        session[:voting][@link.id] = true
    end

    redirect_to :action => :index 
end

def down 
    @link = Link.find(params[:id])

    session[:voting] ||= {}

    unless session[:voting][@link.id] == false
        if session[:voting][@link.id]
            points = 2
        else
            points = 1

        @link.update_attribute :points, @link.points - points

        session[:voting][@link.id] = false
    end

    redirect_to :action => :index 
end

Эта логика должна принадлежать модели, но мы не должны обращаться к переменной сеанса внутри модели.Вы можете изменить этот код внутри модели и просто передать ему сеанс из контроллера.Было бы что-то вроде этого:

def vote type, session
    return if session[:voting][id] == type

    added_points = session[:voting][id].nil? ? 1 : 2

    update_attribute :points, points + (type ? added_points: -added_points)

    session[:voting][id] = type
end

Узнайте больше о сессиях здесь: http://guides.rubyonrails.org/action_controller_overview.html#session

Надеюсь, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...