Rails 3中的link_to (:method => :delete)无法工作

11

我在Rails中的动词方面遇到了麻烦...

在查看一个拥有许多跳蚤(Fleas)的资源(Dog)的页面时,嵌入在dog的show.html.haml中的是一个对render @dog.fleas的调用,它自动(?)查找并使用位于"fleas/_flea.html.haml"中的模板来列出与该dog相关联的每只flea。

这个显示正确。太好了!现在,在每只跳蚤旁边,我放置了一个“Kill Flea”链接,它指向一个URL://localhost:3000/dogs/1/fleas/7。这是由以下生成的:

= link_to("Kill Flea", [ flea.dog, flea ], :method => :delete, :confirm => "Sure? A bunny will die")

但每次点击链接时都没有确认...... 并且它会呈现跳蚤的show.html页面。 就好像它在/dogs/1/fleas/7上使用GET而不是DELETE?!?

PS- 我不担心蜘蛛和机器人删除我的数据库中的内容... 我只是想学习Rails...并理解发生了什么

6个回答

25

Rails 3 现在使用不显眼的 JavaScript 技术。在 Rails 2.3 中,erb 会将所有混乱的 JavaScript 直接塞到链接本身中,在 onClick 事件中执行。现在,JavaScript 已经从链接中移出,并且放入了外部的 js 文件中。请确保您的布局中有这个:

<%= javascript_include_tag :all %>
如果你确实拥有这个问题,那么可能存在更深层次的问题阻止了你的javascript运行,但是这是开始的地方。让我知道结果如何。

天啊!你太厉害了!我一直盯着那些错误信息看了几个小时...尝试了我能想到的一切...一路上都在咒骂Rails!谢谢你! - Meltemi
只是出于好奇,如果再次遇到类似的情况,我应该在哪里寻找线索? - Meltemi
好的,这只是一个偶发问题。如果JavaScript相关的东西不起作用,那么布局可能缺少包含命令。但是,如果您正在寻找其他Rails 3过渡方面的内容,请查看railscasts.com - Ryan Bates创建了一些关于迁移到Rails 3的很棒的屏幕录像。 - Jaime Bellmyer
1
由于某些原因,这个解决方案在Rails4中对我不起作用。我总是看到,“没有路由匹配[GET]“/users/sign_out””。 - Som Poddar

18

嗨,你也可以尝试这个:

application.html.erb:

<%= javascript_include_tag 'jquery_ujs' %>

OR

<%= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js", "jquery.rails.js" %>

1
最佳答案是因为它展示了一种仅加载所需文件的方法,而其他答案则展示了如何包含所有文件,这对性能不利。 - Fernando Kosh
这是帮助了我解决问题的答案。我需要确保在application.js文件中添加以下内容://= require jquery_ujs - Seth Jeffery

12

检查你的<%= javascript_include_tag %>application.html.erb中是否存在。

可能你缺少了"application" js文件。

它至少应该长成这个样子:

<%= javascript_include_tag "application" %>

2
老问题了,但我会给你一个提示... +1 - Meltemi
1
在我看来,这是最合适的答案。它能够正常工作,只调用相关的JS文件,而且简洁明了。 - Jerome

2

在这里,我不使用javascript_include_tag :all, :application等。我使用自己的js文件,以另一个自定义名称:javascript_include_tag :my_custom_file,并且我也遇到了这个问题。我没有在文件中使用'= require jquery',但是javascript/jquery可以工作。我认为Rails默认包含jquery。我所做的是更改了

link_to "Logout", destroy_user_session_path, :method => :delete 

为了

 form_tag destroy_user_session_path, :method => :delete, :id => "logout_form" 
   link_to 'Logout', "#delete", :onclick =>  "$('#logout_form').submit();"

现在它正常工作。


谢谢,好的解决方法。我遇到了一些弹出插件的问题,其中链接被提交为GET请求。这个方法对我有用。 - jbmyid

1

检查是否存在 application.html.erb 文件

<%= javascript_include_tag :application %>

不是这样:
<%= javascript_include_tag :default %>

0

看起来你的link_to方法不太对。尝试使用这段代码:

  <%= link_to 'Kill Flea', [flea.dog, flea], :confirm => 'Sure?', :method => :delete %>

我曾尝试过交换参数...但无济于事。结果证明正是JavaScript,正如@Jamie所说。 - Meltemi
抓住了。很高兴你解决了它! - Sam Ritchie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接