Je suis le Rails Tutorial) de Michael Hartl, et pour une raison quelconque, le code suivant:
<%= link_to 'delete', user, :method => :delete, :confirm => "You sure?",
:title => "Delete #{user.name}" %>
Emet une demande GET (comme je l'ai vérifié en vérifiant le Rails journal du serveur). J'ai également vérifié que la ligne suivante est dans la vue de mon application:
<%= javascript_include_tag :all %>
Une chose que je ne comprenais pas très bien, et c'est probablement la source de mon problème: où est définie la méthode "supprimer"? J'ai vérifié dans le code source de Hartl qu'il définit une méthode "destroy" dans le contrôleur, pas "delete". Mais même si je change le link_to en: method =>: destroy, il émet juste un GET.
J'utilise Rails 3.1. Des conseils?
La plupart des navigateurs ne prennent pas en charge le verbe DELETE, donc Rails le simule en modifiant le code HTML qu'il génère. Rails punaise sur un attribut HTML5 appelé data-method
et le définit sur "delete"
. Ainsi, lorsqu'un utilisateur clique sur le lien, celui-ci est en fait émis sous la forme d'une demande GET
, mais le data-method
l'attribut permet une certaine Rails magie et signifie que votre code de routage devrait le reconnaître comme une demande DELETE.
modifier:
Vous pouvez le tester vous-même dans la console. Courir bundle exec Rails c
pour entrer dans la console, et regardez le HTML que cela génère:
helper.link_to "delete", "foobar/delete", :method => 'delete'
Le HTML devrait ressembler à ceci:
<a href="foobar/delete" data-method="delete" rel="nofollow">delete</a>
Vérifiez également que cela se trouve dans votre application.js:
//= require jquery
//= require jquery_ujs
Apparemment, j'ai eu le jquery sans les jquery_ujs et j'ai eu le même problème jusqu'à ce que j'ajoute cela.
En fait, vous devez utiliser le code suivant
<%= button_to "delete", @user_current, :method => "delete" %>
Il résoudra le problème ou ajoutera cette ligne // = require jquery_ujs to application.js and use:
<%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } ,
:title => "Delete #{user.name}" %>
J'ai rencontré le même problème avec le tutoriel de Michael. Le data-method="delete"
fonctionne réellement comme prévu - il appelle l'action de destruction dans le contrôleur. La raison pour laquelle il essaie de GET
(et finalement d'échouer) est la suivante:
Vous remarquerez que l'un des before_filter
dans le contrôleur est réglé sur signed_in_user
, et en session_helper.rb
, vous remarquerez que signed_in_user
appels store_location
(méthode privée), qui met à jour session[:return_to]
à l'URL actuelle.
Donc, de retour dans l'action de destruction de votre contrôleur, il essaie de redirect_back_or
ce qui donne GET current_url
. J'ai modifié le signed_in_user
assistant pour appeler uniquement store_location
lorsque l'utilisateur n'est pas déjà connecté.
Comme les navigateurs ne prennent pas en charge le verbe DELETE
, Rails crée une solution de contournement pour ce problème en simulant une demande DELETE
via une norme GET
ou POST
. La façon dont method: :delete
fonctionne avec un gestionnaire JavaScript pour tous les liens avec data-method="delete"
qui modifie la demande pour que Rails la traite comme SUPPRIMER . Ce gestionnaire JavaScript est fourni par le jquery_ujs
bibliothèque.
Il y a plusieurs choses qui auraient pu mal tourner:
jquery
et jquery_ujs
chargé en vous application.js
car sans les deux rien ne traitera le lien.method: :delete
option spécifiée.$( 'a' ).click( function( event ) {
event.stopPropagation()
})
Comme cela empêcherait le jquery_ujs
les gestionnaires ne seront pas exécutés et la requête ne sera jamais modifiée et restera juste un GET standard.
On Rails 5:
J'ai le même problème, tous les messages 'SUPPRIMER' ont été compromis, affectant mes pages crud ET concevoir la déconnexion ... pour résoudre le problème, tout ce que j'avais à faire était:
// = nécessite Rails-ujs