删除链接在Rails 3视图中发送“Get”而不是“Delete”

时间:2010-09-23 02:04:44

标签: ruby-on-rails ruby-on-rails-3

我正在使用Rails 3,并且有一个页面可以输出数据库中的帖子列表。我希望能够从链接中删除帖子。

下面的第二个例子有效,但第一个没有。谁知道为什么第一个不起作用?我的观点包含:

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

我的路线文件包含以下内容:

resources :posts 

9 个答案:

答案 0 :(得分:48)

确保布局中的<head>部分包含以下内容:

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

在Rails 3中,正在使用JavaScript处理删除请求,以确保正确发送请求。如果您没有csrf元标记和所需的JavaScript代码,则删除链接将不起作用。 :defaults JavaScript文件包括 - 其中包括prototype.js和application.js。后者包含使链接起作用的东西,但依赖于Prototype框架。

如果您不想使用默认的Prototype JavaScript库,那么有几个其他框架的application.js端口。例如,您可以找到jQuery one here

无论JavaScript如何,按钮仍然有效,因为使用button_to生成的HTML代码本身包含所有必要的信息。这就是为什么你看到按钮工作而链接不工作的原因。

答案 1 :(得分:17)

看起来像

<%= javascript_include_tag :defaults %>

不再受支持

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

相反,你应该使用

<%= javascript_include_tag 'application' %>

答案 2 :(得分:3)

就我而言,我正在使用以下内容。

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

我也使用jQuery,在jQuery下面包含默认原型JS。这引起了某种冲突。

答案 3 :(得分:2)

破坏性操作应作为表单提交执行 - http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

您可以为删除方法或使用表单适当设置按钮的样式。

答案 4 :(得分:2)

在Rails 5.2.3中我遇到了同样的问题,这对我有帮助:

布局头:

<%= javascript_include_tag "rails-ujs" %>

config / initializers / assets

Rails.application.config.assets.precompile += %w( rails-ujs.js )

答案 5 :(得分:1)

我在 Rails 6 中遇到了同样的问题。 Romalex 的解决方案包括:

<%= javascript_include_tag "rails-ujs" %> 在 head 标签 & config/initializers/assets 中的 Rails.application.config.assets.precompile += %w( rails-ujs.js ) 还解决了设计中的 destroy_user_session 无法删除的问题。

所以这个解决方案也适用于这个问题Ruby on Rails - devise users/sign_out not working

答案 6 :(得分:0)

这会奏效。问题是你需要传递正确的路径,以便路由获得它。

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

答案 7 :(得分:0)

在使用Rails 5的情况下,我在布局中使用了以下内容:

<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

通过这种方式:

... </title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
...
 <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
 </head>

答案 8 :(得分:-1)

试试这个..这是一个简单的改变......

将此添加到您的route.rb文件

获取'/ lists /:list_id / comments /:id'=&gt; '评论#破坏'

我做了这个改变,现在它正在运作..