2011-10-09 3 views

Répondre

0

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

+0

Cela ne fonctionnera pas, comme si quelqu'un efface leur session, puis ils peuvent voter à nouveau. –

+1

Je sais. Mais il a dit: "Je comprends que s'ils effacent leurs cookies, ils seront en mesure de voter à nouveau." – adeandrade

+0

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

1

Vous devez les suivre dans le tableau votes qui contient le user_id et un link_id.

Chaque fois qu'un utilisateur vote, recherchez un enregistrement dans ce tableau et s'il existe, envoyez une erreur. Si tel n'est pas le cas, insérez un enregistrement dans cette table et incrémentez le nombre de votes dans la table des liens, éventuellement en utilisant un cache de compteur.

+0

Merci Ryan, comment suggéreriez-vous le suivi des votes si je ne voulais pas rendre l'inscription nécessaire? IP? – Dru

+0

@Dru: oui IP serait bon. Si les gens ont des adresses IP dynamiques, il n'y a aucun moyen d'arrêter cela proprement. –

Questions connexes