44

我正在完成入门教程(创建博客)并且 link_to Destroy 无法正常运行。在终端中,它总是将其解释为#SHOW。

在阅读类似问题时,我了解到必须将 Delete 转换为 POST 以便浏览器对其进行解释。这似乎没有发生。

我在 Lynda.com Rails 课程中使用 Destroy 时也遇到了同样的问题,所以它让我相信它在我的开发环境中存在。我正在为 MacBook Pro Lion 上的 HTTP 服务器使用 Rails 4、Ruby 2.00p274、MySQL、WEBrick。

在选择 Destroy 时的终端会话中:

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)

在 ports-controller.rb 中:

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

    redirect_to action: :index
end

在 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 %>

在 routes.rb

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

13 回答 13

56

尝试这个

<%= link_to 'Destroy',  post,  method: :delete, data: { confirm: 'Are you sure?' } %>
于 2013-08-09T20:36:20.950 回答
42

确保 gem 'jquery-rails' 在 gemfile 中并且 jquery_ujs 包含在 app/assets/javascripts/application.js 文件中

//= require jquery
//= require jquery_ujs

来源:https ://github.com/rails/jquery-ujs

于 2014-04-28T02:29:28.117 回答
18

对于 rails 4.2.X,我遇到了同样的问题。检查了我所有的 javascript 文件,但无法正常工作。如果您仔细查看服务器请求,您将在参数中缺少“authenticity_token”,因此用户将被注销。在 Rails 4.1 及更高版本中,您必须使用button_to而不是 link_to

于 2015-10-03T00:08:28.640 回答
10

我解决了这个问题,只需添加 assets/javascripts/application.js

//= require jquery_ujs
于 2016-07-14T01:03:54.567 回答
4

确保您有一个通过 rake 路由删除 REST 的方法。

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

我只在这个博客版本上遇到了同样的问题,因为我正在做这两个。 http://blog.8thcolor.com/en/2011/08/nested-resources-with-independent-views-in-ruby-on-rails/

我也在尝试学习如何使用 Web 控制台并在其中窥探。我的问题是 binding.pry 不会出现在 destroy 方法中,但会出现。这告诉我它一定是一个坏链接,对吧?它甚至没有使用destroy方法。谢谢大家的答案。我们必须尝试一些事情不是吗?试

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

不会为那个工作。

这是他所拥有的

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

因为您只想删除此处的评论。

但是到目前为止,将如下所示的内容组合起来没有错误,但我仍然没有 binding.pry 来自控制器中的 destroy 方法。

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

我从来没有像你期望的那样得到确认。

因此,请尝试找出可疑的 jquery 发生了什么。我可以确认那是我的情况,但其余的我会留给 nubes,因为这将出现在谷歌搜索中。

于 2015-02-04T09:54:17.587 回答
2

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

这就是问题。即使您method: delete在链接中使用了删除链接,也使用 GET http 动词。

查看以下 SO 线程

于 2013-08-09T20:22:39.613 回答
2

在js中包含以下行

//= require jquery_ujs

包括宝石:

gem 'jquery-rails'

销毁链接:

<%= link_to "Logout", destroy_user_session_path %>
于 2016-01-20T09:45:39.630 回答
1

我遇到了同样的问题,并意识到我创建了我的 rails 应用程序,-J它与--skip-javascript. 您需要启用 JavaScript 才能使其工作;缺少确认删除的弹出窗口是一个死的赠品。

于 2014-11-24T13:25:17.817 回答
0

我和巴里有同样的问题。确保您在 /app/views/index.html.erb 文件中正确复制/粘贴并检查呈现的 html。

于 2014-05-22T02:39:34.493 回答
0

我确实遇到了这个问题,它是由三次单击指南的代码块并将代码直接复制/粘贴到我的编辑器(OSX 上的 ST2)中引起的。

您应该检查为链接生成的 HTML 是否如下所示:

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

如果不是,而是如下所示,则不会应用 Javascript:

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

和未解析的 Ruby之间的巨大差距href是由将指南中使用的不间断空格(unicode 字符\u00a0)复制到脚本中造成的。

我不确定为什么这不会导致脚本解析错误。

于 2014-01-05T14:54:46.157 回答
0

我有同样的问题。就我而言,ai 已将 \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 %>

避免我的第一个 Rails 问题。但它显然破坏了 JavaScript 的执行并导致了 Destroy 问题。因此,将您的 \app\views\layouts\application.html.erb 文件回滚到其原始状态,并将此问题视为此处

Pages#home 中的 Rails ExecJS::ProgramError?

在 evedovelli 答案中(关于 windows 中的咖啡脚本宝石)。

于 2016-01-16T15:25:01.790 回答
0

使用该button_to方法而不是link_to似乎有效,减去它没有确认的事实(我觉得这很重要)。

就我而言,我使用的是 react-on-rails 并且有多种布局。

添加<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>到我的 hello-world 布局中解决了这个问题。

于 2019-08-15T12:44:39.147 回答
0

我遇到了同样的问题。我是这样锻炼的:

我的环境。是:A. ruby​​ 2.2.4p230(2015-12-16 修订版 53155)[x64-mingw32] B. Rails 4.2.5 C. 浏览器:Firfox 44.02

  1. 在html页面中添加include js,因为delete函数会使用js来处理。 <%= javascript_include_tag "application" %>

  2. 添加skip_before_action :verify_authenticity_token 到控制器以防止 AdsController#destroy 中的 InvalidAuthenticityToken

  3. 将 link_to 添加到您的网页中 <%= link_to 'Delete', post, method: :delete, data: {confirm: "Are you sure?"}%>

    现在,我可以使用 link_to 从我的页面中删除一条记录。

于 2016-02-12T01:52:21.767 回答