web-dev-qa-db-fra.com

Méthode link_to de Rails: OBTENIR quand il devrait SUPPRIMER

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?

35
koggit

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>
45
jergason

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.

67
Jamel Toms

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}" %>
10
Hien Luong

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é.

2
Brij

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:

  1. Assurez-vous d'avoir à la fois jquery et jquery_ujs chargé en vous application.js car sans les deux rien ne traitera le lien.
  2. Assurez-vous que le lien en question a bien le method: :delete option spécifiée.
  3. Assurez-vous pour une raison quelconque que vous n'avez pas arrêté la propagation des événements du lien en question, comme par exemple:
$( '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.

1
Itay Grudev

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

0
DribeiroExp