33 votes

Rails 3 UJS - contrôleur est appelée deux fois par link_to à distance :

J'ai un problème bizarre où JQuery est la création de deux requêtes AJAX pour un link_to méthode. Je suis en train d'élaborer un Rails de 3 app avec JQuery pour UJS. J'ai une bascule lien qui permet de basculer entre "Suivre" et "Unfollow'

Mon lien est affiché comme ci-dessous:

<span id="follow_link">
  <a href="http://stackoverflow.com/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Unfollow</a>
</span>

et mon contrôleur est configuré ainsi:

def tfollow_artist
  @artist = Artist.find(params[:id])
  if current_user.following?(@artist) 
    current_user.stop_following(@artist)
  else 
    current_user.follow(@artist)
  end
 end

qui, finalement, rend un js comme:

 $('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>');

Qui remplace essentiellement du contenu html de l' '<span id="follow_link">...</span> avec la même URL, seulement avec le texte étant différents. Par exemple, ci-dessus va maintenant être traduit comme:

<span id="follow_link">
  <a href="http://stackoverflow.com/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Follow</a>
</span>

Cependant, c'est en quelque sorte provoquant JQuery pour faire deux requêtes AJAX.

Peut-on voir quel est le problème ici?

Je suis de l'utilisation de 'jquery-rails" gem qui est la copie la plus récente de jquery-ujs fichier à mon application. JQuery version 1.4.3

26voto

Docunext Points 553

Grâce à cette boîte de dialogue:

https://github.com/rails/jquery-ujs/issues/208

J'ai pu découvrir que jquery et jquery_ujs devenaient inclus deux fois.

Je suppose que le jquery-gem rails met automatiquement dans application.js et puis, j'ai eu inclus dans application.js ainsi.

Semble que, pour quelque raison que ce soit application.js le regroupement automatique de tout dans app/assets/javascripts/ - même quand j'enlève tous les exige.

Donc, si votre à distance: = > true, les formes se sont présentés deux fois, essayez de vérifier application.js.

Espérons que cette aide!

Mise à JOUR: je crois que cela pourrait avoir quelque chose à faire avec moi un pré-rendu mes biens sans l'aide d'un résumé, alors quand mon environnement de développement ajoute des balises script dans le code html de la tête dynamiquement à partir de la nécessite app/assets/application.js il ajoute également une de ce que doit être un vide dynamique application.js, à l'exception de la statique du public/actifs est chargé. Confus? Yep!

17voto

freeman Points 141

J'ai eu le même problème, fixe en commentant cette ligne

\#config.assets.debug = true

le mode de développement

5voto

Eugene Points 111

J'ai eu simmilar question. Courir après râteau tâches résolu mon problème.

rake tmp:clear
rake assets:clean

3voto

dteoh Points 1931

Je pense que ce qui se passe, c'est que votre JavaScript est de ne pas s'arrêter au lien d'être exécuté par le navigateur. Ainsi, vous obtenez la requête AJAX puis le navigateur demande.

Il y a une explication et une solution pour cela sur des Rails en Fonte 174. Texte d'explication ici, environ 3/4 de la page vers le bas.

2voto

hoitomt Points 306

J'ai eu le même problème: dupliquer les demandes lors de l'utilisation :distance => true. Mon problème était dû à utiliser Heroku et la précompilation des actifs. Je suis la précompilation des actifs avant le déploiement à Heroku (râteau actifs:précompiler). Essentiellement, cela crée une copie de votre asset pipeline dans votre dossier public. Donc, la même chose qui se passait, comme mentionné par Docunext: il y avait plusieurs fichiers javascript le traitement de chaque demande.

Il est résolu si je supprime les actifs dans le répertoire public pour le travail local (git rm-rf public/actifs). Après l'enlèvement de l'immobilisation de l'annuaire public, il a cessé d'envoyer des demandes multiples

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X