2008-10-14 8 views
2

J'essaie actuellement de programmer ma première interface ajax en utilisant Rails.Mettre à jour l'état des lignes en utilisant ajax

L'application affiche actuellement une table remplie avec des éléments de liste. L'utilisateur doit approuver ou rejeter chacun des éléments de la liste. J'ai actuellement un lien d'édition à la fin de chaque rangée qui montre un formulaire dans lequel je peux approuver l'article de liste.

Je pense utiliser une case à cocher au lieu du lien d'édition. Lorsque l'utilisateur clique sur la case à cocher je veux mettre à jour la base de données avec le statut, le nom d'utilisateur et la date/heure sans quitter cette page.

  1. Quelles étapes dois-je suivre?
  2. Puis-je utiliser une case à cocher ou suis-je restreint aux boutons?
  3. Quelle aide xxx_remote devrais-je utiliser?
  4. Comment puis-je mettre à jour l'état de la case à cocher avec les résultats de l'appel ajax?
+0

Dois-je utiliser observe_field? – hectorsq

+0

Vous pouvez également modifier directement votre propre question, pas besoin de mettre des ajouts dans les commentaires. – Tomalak

Répondre

5

Je ne pense pas qu'une case à cocher soit le bon contrôle pour ce que vous cherchez. Vous avez indiqué que vous souhaitez que l'utilisateur puisse approuver ou rejeter des éléments, ce qui signifie que vous avez 3 états: non pris en charge, approuvé et rejeté. Une case à cocher ne prend en charge que 2 états: éteint et allumé

J'utiliserais deux liens accepter et rejeter, puis procéder comme suit.

À votre avis:

... 
<tr id="item1"> 
    <td>Accept or Reject</td> 
    <td> 
    link_to_remote 'accept', :action => :accept, :id => 1, :method => :post 
    link_to_remote 'reject', :action => :reject, :id => 1, :method => :post 
    </td> 
</tr> 
... 

Dans votre contrôleur

def accept 
    item = Item.find(params[:id]) 
    item.accept 
    respond_to do |want| 
    want.js { 
     render :update do |page| 
     page << "$('item_#{item.id}').cells[0].innerHTML = 'Accepted'" 
     ...include other updates you need to make to your row... 
     page.visual_effect :highlight, "item_#{item.id}" 
     end 
    } 
    end 
end  
... similar for reject method ... 
+0

Je viens de mettre à jour mon application. Ça a bien marché! – hectorsq

1

Ceci est un commentaire à la solution proposée par Andrew,

je devais écrire params de link_to_remote fonctionner comme ceci

link_to_remote 'reject', :url => {:action => :reject, :id => item.id, :method => :post} 

Aussi, n'oubliez pas d'ajouter de nouvelles actions à votre routes.rb si vous utilisez des ressources reposant à savoir

map.resources :items, :member => {:accept => :post, :reject => :post} 
+0

Merci pour votre réponse. J'ai ajouté les nouvelles actions aussi. – hectorsq

Questions connexes