55 votes

link_to :confirm affiche la popup deux fois

Cette étiquette avec rails 3

<%= link_to 'Destroy', item, :method => :delete,:confirm=>'Are you sure?' %>

produit ce html

<a href="http://stackoverflow.com/news/3" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>

L'entrée est supprimée, le problème est que la popup apparaît deux fois.

Quelle pourrait en être la cause ?

0 votes

Quelle bibliothèque JavaScript utilisez-vous ?

77voto

BMB Points 941

J'ai rencontré le même problème et j'ai passé près d'une heure à le résoudre. J'ai trouvé une solution à ma situation, et je me suis dit que je la partagerais au cas où elle serait utile...

Mon problème était que j'avais

config.assets.debug = true 

sur config/environnements/developpement.rb

En changeant cette ligne en

config.assets.debug = false

a corrigé la duplication de la confirmation pour moi. J'ai trouvé les informations pertinentes dans ce guide des rails pour le pipeline des actifs . J'espère que cela vous aidera !

7 votes

Même chose ici. J'ai découvert que je pouvais laisser le débogage activé si je supprimais les actifs compilés du serveur de développement.

0 votes

Merci. Je n'arrivais pas à comprendre pourquoi ça se passait comme ça.

12 votes

Je voulais juste ajouter que, comme toute autre configuration d'environnement, j'ai dû redémarrer mon serveur Rails. (juste au cas où quelqu'un se ferait piéger par cela aussi).

75voto

Scott Lowe Points 9412

Il semble que le gestionnaire de confirmation Javascript dans rails.js soit attaché deux fois.

Pourriez-vous inclure accidentellement deux copies de rails.js via la duplication d'une aide javascript_include_tag ?

0 votes

D'oh ! C'est ça. Merci.

0 votes

Pourquoi je n'ai pas de fichier rails.js ?

6 votes

@Tony Si vous utilisez Rails 3.1 ou une version ultérieure, rails.js a été remplacé par jquery.js et jquery_ujs dans le pipeline des actifs.

45voto

Nockenfell Points 511

J'ai l'habitude d'inclure le javascript_include_tag au bas de mon dossier de présentation de l'entreprise.

Avec Rails4 et Turbolinks, c'est ce qui se passe :

  • Tout est correct lors du premier chargement d'une page (la fenêtre de confirmation n'apparaît qu'une seule fois).
  • Visite d'une autre page -> la popup apparaît deux fois
  • Visite d'une page supplémentaire -> la popup se produit trois fois
  • et ainsi de suite
  • jusqu'à ce que je recharge la page.

J'ai résolu le problème en déplaçant le javascript_include_tag du fond vers <head>

7 votes

C'est ici ! Turbolinks ne recharge pas toute la page, il ne recharge que le corps, le titre (et quelques autres choses), mais comme mes javascripts étaient dans le corps, ils étaient réappliqués plusieurs fois ! Merci, Nockenfell !

0 votes

Cela a non seulement fonctionné pour moi, mais aussi pour mes menus déroulants Twitter Bootstrap : ils apparaissaient après un rechargement de la page, mais pas après avoir suivi un lien vers une autre page.

0 votes

Cela a également réglé mon problème. Merci !

1voto

Espen Points 938

Cela semble être un bug dans Rails. Apparemment, les directives dans application.js sont non seulement développées en fichiers individuels lorsque le mode débogage est activé, mais elles sont également incluses dans application.js. Je n'ai pas regardé le code de Rails pour cela mais je suppose que c'est dû au fait que application.js est le fichier JavaScript par défaut. Si vous renommez ce fichier en quelque chose d'autre, disons default.js, en mode débogage, il inclura correctement les fichiers spécifiés par la directive et default.js ne produira que le JavaScript qui se trouve uniquement dans ce fichier. Ainsi, il ne génère pas de code en double.

Ejemplo:

application.js

//= nécessite jquery_ujs

foo() ;

Résultats dans :

1) jquery_ujs.js

2) application.js avec le contenu de jquery_ujs et foo()


default.js

//= nécessite jquery_ujs

foo() ;

Résultats dans :

1) jquery_ujs.js

2) default.js avec foo()

1voto

Carsten Points 11

J'ai eu le même problème avec Rails 3.2.12, mais une simple mise à jour vers 3.2.13 a résolu le problème pour moi.

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