我正在关注Michael Hartl的Rails教程,并出于某种原因使用以下代码:
<%= link_to 'delete', user, :method => :delete, :confirm => "You sure?",
:title => "Delete #{user.name}" %>
发出GET请求(我通过检查rails服务器日志来验证)。我还验证了以下行在我的应用程序视图中:
<%= javascript_include_tag :all %>
有一点我不太明白,这可能是我问题的根源:&#34;删除&#34;方法定义?我在Hartl's source code验证了他定义了一个&#34; destroy&#34;控制器中的方法,而不是&#34;删除&#34;。但即使我将link_to更改为:method =&gt; :破坏,它只是发出一个GET。
我使用的是Rails 3.1。有什么提示吗?
答案 0 :(得分:65)
同时检查这是否在您的application.js中:
//= require jquery
//= require jquery_ujs
显然我没有jquery_ujs的jquery,我有同样的问题,直到我添加它。
答案 1 :(得分:41)
大多数浏览器实际上并不支持DELETE动词,因此Rails通过修改它生成的HTML来伪造它。 Rails对名为data-method
的HTML5属性进行处理,并将其设置为"delete"
。因此,当用户点击链接时,它实际上是作为GET
请求发出的,但data-method
属性允许一些Rails魔法,并且意味着您的路由代码应将其识别为DELETE请求。
修改强>
您可以在控制台中自行测试。运行bundle exec rails c
进入控制台,查看生成的HTML:
helper.link_to "delete", "foobar/delete", :method => 'delete'
HTML应如下所示:
<a href="foobar/delete" data-method="delete" rel="nofollow">delete</a>
答案 2 :(得分:9)
实际上,您应该使用以下代码
<%= button_to "delete", @user_current, :method => "delete" %>
它将解决问题或将此行// = require jquery_ujs添加到application.js并使用:
<%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } ,
:title => "Delete #{user.name}" %>
答案 3 :(得分:2)
我在迈克尔的教程中遇到了同样的问题。 data-method="delete"
实际上按预期工作 - 它确实在控制器中调用destroy动作。它尝试GET
(并最终失败)的原因如下:
您会注意到控制器中的before_filter
之一设置为signed_in_user
,而session_helper.rb
,您会注意到signed_in_user
来电{ {1}}(私有方法),将store_location
更新为当前网址。
因此,回到控制器的销毁操作中,它会尝试session[:return_to]
,从而导致redirect_back_or
。我修改了GET current_url
帮助程序,仅在用户尚未登录时才调用signed_in_user
。
答案 4 :(得分:2)
我们需要的是添加以下代码行
//= require jquery_ujs
似乎是个错误:))
答案 5 :(得分:1)
由于浏览器不支持DELETE
动词,因此Rails通过标准DELETE
或GET
模拟POST
请求,为此问题创建解决方法。 method: :delete
的工作方式是使用data-method="delete"
的所有链接的JavaScript处理程序来修改请求,以便Rails
将其作为 DELETE 处理。此JavaScript处理程序由jquery_ujs
库提供。
有几件事可能出错:
jquery
加载了jquery_ujs
和application.js
,因为没有任何内容可以处理链接。method: :delete
选项。$( 'a' ).click( function( event ) {
event.stopPropagation()
})
因为这会阻止执行jquery_ujs
处理程序,并且永远不会修改请求,并且只会保持标准GET。
答案 6 :(得分:0)
在轨道5上:
遇到同样的问题,所有“删除”的帖子都被盗用,影响了我的原始页面并设计了登出...要解决的问题,我要做的就是:
// =需要rails-ujs