Je ne recommanderais pas le faire de cette façon, mais si vous insistez, je dirais que vous devez créer un hachage avec les ids du lien comme clés et leurs valeurs définies à Vrai ou faux selon le type de vote.
je changerais votre contrôleur comme ceci:
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
Cette logique devrait appartenir au modèle, mais nous ne devrions pas accéder à la variable de session à l'intérieur du modèle. Vous pouvez refactoriser ce code dans le modèle et lui passer la session depuis le contrôleur. Ce serait quelque chose comme ceci:
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
En savoir plus sur les sessions ici: http://guides.rubyonrails.org/action_controller_overview.html#session
espoir qui fonctionne. Je ne stockerais pas ceci dans des biscuits ou même la session
Cela ne fonctionnera pas, comme si quelqu'un efface leur session, puis ils peuvent voter à nouveau. –
Je sais. Mais il a dit: "Je comprends que s'ils effacent leurs cookies, ils seront en mesure de voter à nouveau." – adeandrade
Je comprends les implications de l'utilisation de cookies. Merci adeandrade, je vais suivre vos conseils et suivre les votes en utilisant une autre méthode que les cookies. – Dru