2016-03-01 2 views
0

Je suis tout simplement essayer de construire un link_to avec method: :delete pour appeler la méthode destroy dans mon contrôleur utilisateurs:rails 4.2 Méthode link_to: Aucun résultat de route [POST]

<%= link_to 'disable token', user_path(user), method: :delete, data: { confirm: 'Are you sure?'} %> 

qui génère du HTML qui ressemble à:

<a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="https://stackoverflow.com/users/6">disable token</a> 

Mon fichier application.js a:

//= require jquery                                    
//= require jquery_ujs 

Et, en fait, je sais que le javascript est chargé et fait ce qu'il est censé faire, parce qu'il génère la boîte de dialogue d'alerte 'Êtes-vous sûr?'

Cependant, en suivant le lien que je reçois le texte suivant:

No route matches [POST] "https://stackoverflow.com/users/9" 

Et en effet, il n'y a pas cette route, parce que mes seuls itinéraires sont:

users_path GET /users(.:format) users#index 
user_path DELETE /users/:id(.:format) users#destroy 

Le mystère (pour moi) est POURQUOI Rails fait-il un POST sur cette route en premier lieu? Vous noterez que l'URL est correcte ("/ users/9") mais que le verbe HTTP n'est pas: POST.

Les paramètres de la requête sont Préparatifs:

{"_method"=>"delete", 
"authenticity_token"=>"VcAVJF1/f9mwjNI4GPteRtDiyjKobnioF0hIQvF+3BVMzUnIoHymM2Z3w2sqSLJqJ11sZ/tIHt78aA9 
} 

Ici vous pouvez voir la clé _method étant réglé sur delete comme il devrait être, alors pourquoi l'erreur de routage?!?

Je suis perplexe.

Edit: Si je change link_to appel à inclure remote: true routes Rails à l'itinéraire approprié! Donc, comme un "correctif" pour cela, j'ai changé mon contrôleur pour utiliser UJS, mais je n'aime pas cela parce que, eh bien, autant que je sache ce que j'avais avant devrait fonctionner!

Voici la requête SUPPRIMER appel qui envoie un bon link_to comme JS:

<%= link_to 'disable token', u, method: :delete, data: { confirm: 'Are you sure?'}, remote: true %>                                             
+0

BTW - J'ai passé en revue les différentes questions et réponses sur la pile liées à link_to et à la méthode:: delete, mais je n'ai trouvé personne avec ce problème. S'il y a une réponse étendue, veuillez la poster! Merci. – ipd

+1

Peut-être que cela aiderait à utiliser quelque chose comme les outils de développement chrome et inspecter le HTML généré par ce 'link_to'. Vous pouvez également l'utiliser pour vous assurer que vous regardez le bon lien. – panmari

+1

Quelle version de rails est utilisée dans votre application? – Aamir

Répondre

0

juste essayer indiquant explicitement l'action du contrôleur et la méthode aussi (note @user.id est un exemple, vous pouvez référencez différemment) avec url_for:

<%= link_to 'disable token', url_for(action: :destroy, id: @user.id), method: :delete, data: { confirm: 'Are you sure?'} %> 
+0

Merci pour la suggestion Adrian, mais je crains que cela n'a pas fonctionné. – ipd

+0

Ok, la même erreur a-t-elle été renvoyée? Aussi, pouvez-vous ajouter le contenu de votre fichier de routes à votre question? Ensuite, si je peux aider, je vais modifier ma réponse ou la supprimer. –

0

Je soupçonne dans ce cas est qu'il ya un autre javascript qui est prépondérant le comportement des rails.

J'ai eu le même problème (mais avec obtenir une demande GET, plutôt que POST). Il s'est avéré un peu trop indépendant de JS qui était trop général dans le sélecteur, et appelait stopPropagation jquery sur toutes les balises d'ancrage entourant un bouton, ce qui était la façon dont mon code HTML particulier a été mis en place.