Rails 4.2.0 app: delete link javascript停止工作



我有一个Rails 4.2.0应用程序,已经运行了几个月了。

该应用程序在不同的地方有link_to标签,使用"delete"作为方法并带有确认提示。这些都是正常工作的,在删除之前弹出警报以确认,并且请求被路由到控制器中的destroy动作,如预期的那样。

今天一个应用程序用户问我为什么删除链接不起作用。没有显示确认警报,结果请求是一个简单的GET,它被路由到show操作而不是destroy。虽然我的用户不经常删除,但我确信他们最初是在工作。

删除链接不再在开发环境或运行环境中工作。当加载包含链接的页面或点击删除链接时,在浏览器控制台中没有javascript错误。在Chrome, Firefox和Safari上都是一样的。

神秘的部分是,几个月来我一直在做代码和数据库的修改;我不记得上次添加gem或运行bundle install或update是什么时候了。显然,必须改变一些东西来破坏javascript,但我想不出它可能是什么。

到目前为止,我已经删除了rails jQuery并从Google API链接到一个。我已经移除了涡轮链接。我已经更新了jquery-rails gem从v. 4.0.3到4.2.1。没有运气。

如果有人可以建议一些测试或查看的东西,这里是我的配置和代码的一些摘录(在恢复上述失败的尝试之后):

Gemfile.lock:

jquery-rails (4.0.3)
jquery-turbolinks (2.1.0)
jquery-ui-rails (5.0.3)

application.js:

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
//= require jquery-ui/datepicker
//= require jquery-ui/autocomplete
//= require_tree .

app/views/布局/application.html。动词,在标签内:

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

删除链接标签如下:

<%= link_to 'Delete', item_order_path(@item, order), method: :delete, data: { confirm: 'Are you sure?' }, class: :button %>

在呈现的HTML中,它们看起来像这样:

<a data-confirm="Are you sure?" class="button" rel="nofollow" data-method="delete" href="/items/1/orders/1">Delete</a>

你知道会发生什么吗?

好了,我发现问题出在哪里了(他就是我自己!)

我本来要羞愧地删掉这个问题,但后来我想到,有人可能会从我追踪问题的方式中受益。

首先,我记得上次与gem相关的更改是在应用程序中添加了一个自动完成字段。所以我去掉了 一行。
//= require jquery-ui/autocomplete
从application.js

。果不其然!删除链接又开始工作了

我正要自以为是地指责jquery-ui与Rails javascript不兼容时,我注意到删除这一行实际上是抛出一个异常,在我的javascript正在初始化自动完成字段。这听起来很可疑,就像我的应用程序的javascript中的某些东西干扰了链接javascript,该异常恰好阻止了执行。

所以我恢复了application.js文件并重命名了我所有的javascript资产,这样服务器就不会识别它们。删除链接现在又工作了。然后我一个接一个地恢复了每个javascript文件,在页面刷新后测试链接。最后,删除链接在重新引入一个文件后停止工作:这个文件是最近更改的。

问题本身是所有的删除链接都包含在表中,并且我最近为这些表添加了单击处理程序来对行进行排序。我的表的单击处理程序在单击事件上停止传播,这阻止了用于删除链接的Rails处理程序启动。我还没有解决这个问题,但它可能涉及到更仔细地定位排序事件处理程序,以便删除链接不受影响。

最新更新