web-dev-qa-db-fra.com

Rails 4 link_to Destroy ne fonctionne pas dans le didacticiel de prise en main

Je suis en train de suivre le didacticiel de prise en main (création d'un blog) et le lien_pour détruire ne fonctionne pas correctement. Dans le terminal, il est toujours interprété comme étant #SHOW. 

En lisant des problèmes similaires, j’ai appris que la suppression doit être convertie en un POST pour que le navigateur l’interprète. Cela ne semble pas se produire. 

J'ai rencontré le même problème en utilisant Destroy dans le cours Lynda.com Rails également, donc cela me porte à croire que cela fait partie de mon environnement de développement. J'utilise Rails 4, Ruby 2.00p274, MySQL, WEBrick pour le serveur HTTP sur un MacBook Pro Lion. 

dans la session de terminal lorsque Destroy est sélectionné:

Started GET "/posts/4" for 127.0.0.1 at 2013-08-09 13:45:20 -0600
Processing by PostsController#show as HTML
  Parameters: {"id"=>"4"}
  Post Load (0.6ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1  [["id", "4"]]
  Rendered posts/show.html.erb within layouts/application (0.4ms)
Completed 200 OK in 13ms (Views: 8.6ms | ActiveRecord: 0.6ms)

Dans le ports-controller.rb:

def destroy
    @post = Post.find(params[:id])
    @post.destroy

    redirect_to action: :index
end

Dans le fichier index.html.erb:

<% @posts.each do |post| %>
  <tr>
    <td><%= post.title %></td>
     <td><%= post.text %></td>
    <td><%= link_to 'Show', post %></td>
    <td><%= link_to 'Edit', edit_post_path(post) %></td>
    <td><%= link_to 'Destroy',  { action: :destroy, id: post.id }, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
 <% end %>

Dans les routes.rb

Blog::Application.routes.draw do
   resources :posts do
     resources :comments
   end
  root to: 'welcome#index'
end
37
hyperview.ca

Essaye ça

<%= link_to 'Destroy',  post,  method: :delete, data: { confirm: 'Are you sure?' } %>
48
hawk

Assurez-vous que gem 'jquery-Rails' est dans gemfile et que jquery_ujs est inclus dans le fichier app/assets/javascripts/application.js.

//= require jquery
//= require jquery_ujs

Source: https://github.com/Rails/jquery-ujs

39
rlshep

J'ai eu le même problème, pour Rails 4.2.X. Vérifié tous mes fichiers javascript mais ne pouvait pas le faire fonctionner. Si vous regardez attentivement la requête du serveur, il manquera 'authenticity_token' dans les paramètres, de sorte que l'utilisateur soit déconnecté . Dans Rails 4.1 et supérieurs, vous devez utiliser button_to au lieu de link_to

14
nowRails

J'ai résolu le problème en ajoutant simplement assets/javascripts/application.js

//= require jquery_ujs
7
Marcelo Bento

Assurez-vous que vous avez une méthode Delete REST via les routes rake.

DELETE /articles/:id(.:format)                     articles#destroy

J'ai le même problème uniquement avec cette version de blog car je fais les deux . http://blog.8thcolor.com/fr/2011/08/nested-resources-with-independent-views- Ruby-on-Rails/

J'essaie également d'apprendre à utiliser la console Web et à y faire levier . Mon problème est que binding.pry n'apparaît pas dans la méthode destroy, mais le sera. Cela me dit que ce doit être un mauvais lien, non? Cela n'arrive même pas à la méthode de destruction. Merci à tous pour vos réponses. Nous devons essayer des choses, n'est-ce pas? Essayer

<td><%= link_to 'Destroy', { action: :destroy, id: post.id }, method: :delete, data: { confirm: 'Are you sure?' } %></td> 

ne va pas travailler pour celui-là.

Voici ce qu'il a

<td><%= link_to 'Destroy', [comment.post, comment], :confirm => 'Are you sure?', :method => :delete %></td>

parce que vous voulez seulement supprimer le commentaire ici.

Mais combiner les choses jusqu’ici comme ci-dessous ne donne aucune erreur, mais je n’ai toujours pas de binding.pry de la méthode destroy du contrôleur.

<td><%= link_to 'Destroy', [comment.post, comment], method: :delete, data: { confirm: 'Are you sure?' } %></td>

et je ne reçois jamais la confirmation comme on peut s'y attendre.

Alors essayez de comprendre ce qui se passe avec JQuery en tant que suspect ... Je peux confirmer que c'était mon cas, mais le reste je laisserai pour les nubes parce que cela apparaîtra dans une recherche Google.

3
Douglas G. Allen

Started GET "/posts/4" for 127.0.0.1 at 2013-08-09 13:45:20 -0600

C'est le problème. Le lien de suppression utilise le verbe http GET même si vous avez utilisé method: delete dans votre lien.

Découvrez le fil SO suivant

2
Jason Kim

inclure la ligne ci-dessous dans js

//= require jquery_ujs

inclure gem:

gem 'jquery-Rails'

Détruire le lien:

<%= link_to "Logout", destroy_user_session_path %>
2
Chitresh goyal

J'avais le même problème et me suis rendu compte que j'avais créé mon application Rails avec -J, qui est identique à --skip-javascript. Vous devez activer JavaScript pour que cela fonctionne. l'absence d'une fenêtre contextuelle pour confirmer la suppression est un cadeau mort.

1
1jgjgjg

J'ai eu exactement ce problème et cela a été causé par un triple clic sur le bloc de code du Guide et un copier/coller du code directement dans mon éditeur (ST2 sur OSX). 

Vous devriez vérifier que le code HTML généré pour le lien ressemble à ceci: 

<a data-confirm="Are you sure?" data-method="delete" href="/posts/3/comments/3" rel="nofollow">Destroy Comment</a>

Si ce n'est pas le cas, mais ressemble à ce qui suit, le javascript ne sera pas appliqué:

<a href="/posts/3/comments/3"                data="{:confirm=&gt;&quot;Are you sure?&quot;}"                method="delete">Destroy Comment</a>

Les grands espaces entre href et Ruby non analysé sont dus aux espaces insécables (caractère Unicode \u00a0) utilisés dans le Guide copiés dans votre script.

Je ne sais pas pourquoi cela ne provoque pas d'erreur d'analyse de script.

0
Barry

J'ai eu le même problème. Dans mon cas, un fichier i change\app\views\layouts\application.html.erb 

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>

à

<%= stylesheet_link_tag    'default', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'default', 'data-turbolinks-track' => true %>

pour éviter mon tout premier problème Rails. Mais il a apparemment mutilé l’exécution de JavaScript et provoqué le problème Destroy . Par conséquent, rétablissez le statut de votre fichier\app\views\layouts\application.html.erb et réglez le problème comme ici

Rails ExecJS :: ProgramError dans Pages # home?

dans evedovelli answer (à propos de la pierre précieuse coffeescript dans Windows).

0
Enlighten

J'ai le même problème. Je travaille par cette voie:

Mon env. est un. Ruby 2.2.4p230 (2015-12-16 révision 53155) [x64-mingw32] B. Rails 4.2.5 C. Navigateur: Firfox 44.02

  1. ajoutez include js dans la page html car la fonction delete utilisera js pour gérer .<%= javascript_include_tag "application" %>

  2. ajoutez skip_before_action :verify_authenticity_token au contrôleur pour empêcher InvalidAuthenticityToken dans AdsController # destroy

  3. ajoutez link_to dans votre page Web <%= link_to 'Delete', post, method: :delete, data: {confirm: "Are you sure?"}%>

    Maintenant, je peux utiliser link_to pour supprimer un enregistrement de ma page.

0
Sam Sheen

J'ai eu le même problème que Barry. Assurez-vous de bien copier/coller dans votre fichier /app/views/index.html.erb et inspectez le code HTML rendu.

0
danjonesgh