Rails 4 link_to Destroy在“入门”教程中不起作用

时间:2013-08-09 20:15:14

标签: ruby-on-rails

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

在阅读类似问题时,我了解到删除必须转换为POST以供浏览器解释。这似乎没有发生。

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

选择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

13 个答案:

答案 0 :(得分:51)

试试这个

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

答案 1 :(得分:39)

确保gem&#39; jquery-rails&#39;在gemfile中,jquery_ujs包含在app / assets / javascripts / application.js文件中

//= require jquery
//= require jquery_ujs

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

答案 2 :(得分:14)

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

答案 3 :(得分:7)

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

//= require jquery_ujs

答案 4 :(得分:3)

确保通过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方法中,但会显示出来。这告诉我它一定是一个糟糕的链接吗?它甚至没有达到破坏方法。谢谢大家的答案。我们确实要尝试不要的东西吗? 试图

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

因为你只想在这里删除评论。

但到目前为止,如下所示的组合没有给出任何错误,但我仍然没有来自控制器中destroy方法的binding.pry。

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

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

所以试着弄清楚jquery正在发生什么事情。 我可以确认这是我的情况,但剩下的我将留给nubes,因为这将显示在谷歌搜索。

答案 5 :(得分:2)

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

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

Check out the following SO thread

答案 6 :(得分:2)

在js中包含以下行

//= require jquery_ujs

包括gem:

gem 'jquery-rails'

销毁链接:

<%= link_to "Logout", destroy_user_session_path %>

答案 7 :(得分:1)

我遇到了同样的问题,并意识到我使用-J创建了我的rails应用,与--skip-javascript相同。 您需要启用JavaScript才能实现此功能;没有弹出窗口确认删除是一个死的赠品。

答案 8 :(得分:0)

我确实遇到了这个问题,这是由于三次点击Guide的代码块并将代码直接复制/粘贴到我的编辑器(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>

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我有同样的问题。在我的情况下,我从

更改了\ 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文件回滚到其原始状态,并将此问题视为此处

Rails ExecJS::ProgramError in Pages#home?

在evedovelli的回答中(关于windows中的coffeescript gem)。

答案 11 :(得分: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中的InvalidAuthenticityToken#destroy

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

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

答案 12 :(得分:0)

使用button_to方法代替link_to似乎可行,去掉了不能确认的事实(我认为这很重要)。

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

在我的世界布局中添加<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>可以解决此问题。