2010-10-20 19 views
1

J'essaie de permettre aux utilisateurs de voter un enregistrement haut/bas avec Ajax. J'utilise le plugin vote_fu pour la fonctionnalité de vote, et tout fonctionne bien sans Ajax. J'essaye maintenant de comprendre la meilleure manière d'implémenter la fonctionnalité asynchrone avec le javascript discret. Ce que je fais maintenant est d'avoir deux boutons, "Haut" et "Bas", de sorte que lorsque vous cliquez sur l'un ou l'autre, une demande est faite à votes_controller et l'action créer ou mettre à jour, selon si l'utilisateur avait déjà soumis un vote sur ce dossier avant. Les paramètres soumis seraient le record_id ainsi que la valeur du vote. Avec Ajax, comment dois-je gérer le cas où un utilisateur entre une page pour voter sans avoir voté sur l'enregistrement avant? Plus précisément, les liens iraient aux votes # créer au début, mais après cette première soumission, les liens devraient passer aux votes # mise à jour.Voter avec Ajax dans Rails

Existe-t-il un moyen standard de prendre soin de cela? Je pensais juste à ajouter une vérification supplémentaire dans la méthode "create" de telle sorte qu'elle agirait comme "update" si elle trouvait un enregistrement pour la paire user_id, voteable_id, mais cela semblait assez maladroit et pas complètement RESTful.

Merci, Eric

Répondre

1

Il existe plusieurs techniques/modèles couramment utilisés:

1) Lorsque votre erb crée la page, vous pouvez fournir un paramètre au script JS qui est une partie de la page . Le paramètre sera le "voting_url" ce sera soit votes/new ou votes/123 selon si une opération de création ou de mise à jour doit être utilisée.

2) Vous pouvez utiliser un "appel de procédure" par opposition à un appel de repos. La procédure/action serait "change_vote" - avec un param de "up" qui serait soit vrai soit faux. L'action créerait l'enregistrement de vote si nécessaire, ou le modifierait autrement.

3) Dans le cadre du processus de création de l'enregistrement principal, vous pouvez toujours créer le vote_record. De cette façon, les opérations de vote seront toujours des mises à jour puisque le vote_record existera toujours déjà.

Ajouté

Re: Commentaire de quand est-il généralement "acceptable" pour se éloigner d'un appel de repos?

Le repos est une philosophie de conception. Il résout beaucoup de problèmes mais ne convient pas à toutes les situations. Je pense que votre question initiale serait acceptable, mais en fin de compte, c'est à vous et à quiconque examine votre architecture. Puisqu'il est possible de "plier" votre application dans un api de repos pour cette fonction, certains pourraient vous dire de le faire - pour obtenir ainsi l'avantage de ne pas violer le repos.

Re: votre exemple dans vos commentaires sur les relations ami:

Comme il est logique de « créer une relation d'ami » ce serait mieux, d'autres choses étant égales par ailleurs, d'exprimer l'api comme repos « amitié objet/créer "appel". C'était exactement pour votre exemple d'ami que le repos a été créé. - L'alternative de style ancien est que chaque développeur d'api devait trouver un grand nombre de noms de procédures.

Le repos fournit une manière standard plus cohérente de créer les noms.

Notez qu'une procédure "change_vote" serait mieux définie dans le cadre de l'objet votes: soit votes/change_vote ou quelque chose de similaire. Je crois qu'il y a un "chemin Rails" pour les urls pour les procédures de repos qui ne correspondent pas aux verbes de repos standard.

+0

je pensais à utiliser simplement un appel de procédure, mais par curiosité, quand est-il généralement « acceptable » pour se éloigner d'un appel de repos? Par exemple, si vous avez une relation d'ami entre les utilisateurs, seriez-vous amis avec FriendshipsController # create ou UsersController # addFriend? – Eric

+0

Réponse mise à jour concernant votre commentaire. –

0

Une autre idée serait de changer l'url (via un assistant probablement) selon que l'enregistrement est nouveau.

Quelque chose comme:

link_to_remote "Up", :url => voting_path(@vote) 

module VotesHelper 
    def voting_path(vote) 
    if vote.new_record? 
     new_voting_path 
    else 
     edit_voting_path(vote) 
    end 
    end 
end