Rails的link_to方法:获取它应该删除的时间

时间:2011-09-19 02:25:28

标签: ruby-on-rails-3 httpverbs

我正在关注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。有什么提示吗?

7 个答案:

答案 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通过标准DELETEGET模拟POST请求,为此问题创建解决方法。 method: :delete的工作方式是使用data-method="delete"的所有链接的JavaScript处理程序来修改请求,以便Rails 将其作为 DELETE 处理。此JavaScript处理程序由jquery_ujs库提供。

有几件事可能出错:

  1. 确保您jquery加载了jquery_ujsapplication.js,因为没有任何内容可以处理链接。
  2. 确保相关链接确实指定了method: :delete选项。
  3. 请确保由于某种原因您没有停止相关链接的事件传播,例如:
  4. $( 'a' ).click( function( event ) {
        event.stopPropagation()
    })
    

    因为这会阻止执行jquery_ujs处理程序,并且永远不会修改请求,并且只会保持标准GET。

答案 6 :(得分:0)

在轨道5上:

遇到同样的问题,所有“删除”的帖子都被盗用,影响了我的原始页面并设计了登出...要解决的问题,我要做的就是:

// =需要rails-ujs