我正在使用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
答案 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 %>
不再受支持
相反,你应该使用
<%= 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; '评论#破坏'
我做了这个改变,现在它正在运作..