2010-09-23 5 views
38

J'utilise Rails 3 et j'ai une page qui affiche une liste de messages de la base de données. J'aimerais pouvoir supprimer un message d'un lien.Supprimer le lien envoie "Get" au lieu de "Supprimer" dans Rails 3 vue

Le 2ème exemple ci-dessous fonctionne, mais le premier ne fonctionne pas. Quelqu'un sait pourquoi le premier ne fonctionnera pas? À mon avis, contient:

# this link sends a "GET" request which asks for the #show function 
<%= link_to 'Delete', post, :method => :delete %> 

# this link sends the proper "DELETE" request which asks for the #destroy function 
<%= button_to 'Delete', post, :method => :delete %> 

Mon fichier itinéraires contient les éléments suivants:

resources :posts 

Répondre

48

Assurez-vous que votre section <head> dans la mise en page comprend les éléments suivants:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

Dans Rails 3, la Les demandes de suppression sont traitées à l'aide de JavaScript pour s'assurer que la demande est envoyée correctement. Si vous n'avez pas les balises meta csrf et le code JavaScript requis, supprimez les liens ne fonctionneront pas. Les fichiers JavaScript :defaults incluent entre autres prototype.js et application.js. Ce dernier contient les éléments qui font fonctionner le lien, mais repose sur le framework Prototype.

Si vous ne souhaitez pas utiliser les bibliothèques par défaut Prototype JavaScript, il y a des ports de application.js pour plusieurs autres cadres. Vous pouvez trouver le jQuery un here, par exemple.

Les boutons fonctionne toujours indépendamment de JavaScript, comme le code HTML généré avec button_to comprend toutes les informations nécessaires par lui-même. C'est pourquoi vous voyez le bouton fonctionner alors que le lien ne fonctionne pas.

+0

Grande réponse. Je vous remercie. –

+0

Cela m'a beaucoup aidé. – Rupert

+0

merci - pourriez-vous poster un lien pour les détails de cette fonctionnalité de rails 3? – gorn

3

Dans mon cas, j'utilisais ce qui suit. J'utilisais également jQuery en incluant jQuery juste en dessous du prototype JS par défaut. Cela causait une sorte de conflit.

17

ressemble

<%= javascript_include_tag :defaults %> 

est pas pris en charge plus

http://apidock.com/rails/ActionView/Helpers/AssetTagHelper/JavascriptTagHelpers/javascript_include_tag

Au lieu de cela, vous devez utiliser

<%= javascript_include_tag 'application' %> 
+0

Cela est vrai pour Rails 4.0.3. J'ai essayé d'appliquer la réponse acceptée, et cela n'a pas fonctionné jusqu'à ce que je fasse la substitution que vous indiquez ici. –

+0

sauvé mon bacon! – brntsllvn

+0

Cela devrait être la réponse acceptée! Merci! –

0

Cela fonctionne. Le problème est le fait que vous devez passer le bon chemin si la route obtient.

<%= link_to 'Delete', post_path(post.id), :method => :delete %> 
-1

Essayez ceci .. est un simple changement ..

ajouter à votre itinéraire.fichier rb

get '/ listes /: list_id/commentaires /: id' => 'Commentaires # détruire'

J'ai fait ce changement et maintenant son fonctionnement ..

+2

Jamais une bonne idée pour les demandes GET d'apporter des changements durables – Vincent

Questions connexes