Я бы не рекомендовал делать это таким образом, но если вы настаиваете, я бы сказал, что вы должны создать хеш с идентификаторами ссылки в качестве ключей и их значениями, равными 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
Надеюсь, что это работает.