2011-03-12 4 views
2

J'ai un système de vote. Lorsqu'un utilisateur clique sur le bouton "Vote", la valeur du vote est incrémentée de un.Champ de mise à jour sans redirection

Mais le problème est, cette action d'incrément nécessite une redirection que je ne veux pas faire. J'utilise will_paginate pour paginer mes enregistrements. Pour exemple, si un utilisateur a voté pour une entité à la page 2 de la liste paginé, il doit rester à la page 2. Mais, actuellement, il redirige à la page 1.

Vu que j'ai:

<ol> 
    <% for number in @numbers%> 
    <li> 
     <%=number.value%> 
     <%=button_to '+1',:action=>:increment,:id=>number.id,:remote=>true%> 
     </li> 
     <%end%> 
     </ol> 
     <%=will_paginate @numbers%> 

Dans le contrôleur je:

def increment 

     number=Digit.find(params[:id]) 
     number.increment!(:value) 

    end 

Mais quand je ne réorientent pas, je reçois cette erreur:

Missing template digits/increment with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths "c:/Sites/tester/app/views" 

Répondre

0

Avec votre solution actuelle, rails recherche une vue basée sur la méthode controller/method_name.

Vous devez insérer un redirect_to après avoir incrémenté le nombre.

Pour rediriger à la page précédente, c'est une solution:

 redirect_to :back 
    rescue ActionController::RedirectBackError 
    redirect_to root_path 
+0

Merci Mike.C'était fantastique !! –

+0

Mais, ce serait génial si cette mise à jour se produisait comme une tâche de fond. Par exemple, disons que le bouton de vote est destiné à une vidéo qui est en train de jouer dans un popup.Il serait génial si le vote est incrémenté, mais la vidéo continue à jouer Je pensais: à distance => vrai ferait cela.Pouvez-vous me pointer dans la bonne direction? –

+0

Rechercher une requête Ajax avec des rails. Vous avez raison de faire: remote => true dans la vue, mais votre contrôleur doit être capable de gérer cette requête. –

1

Une autre alternative serait de le faire avec une demande XHR.

le code du contrôleur ressemblerait à quelque chose comme ceci:

def increment 
    number=Digit.find(params[:id]) 
    number.increment!(:value) 
    head :ok 
end 

Cela renverra un en-tête en réponse à un état 200, et rien d'autre. Dans votre code javascript, il suffit de gérer la logique d'affichage de l'incrémentation du nombre sur la page si la réponse revient à 200, et éventuellement afficher une erreur si ce n'est pas le cas.

+1

Cette solution nécessite quelques ffort.Mais je pense que ça vaut le coup d'essayer. –

+0

la tête: ok juste fait ma journée :-) Ne peut pas être plus simple. Merci @Jason stewart –