Rails ajax 响应和 DELETE 方法

Posted

技术标签:

【中文标题】Rails ajax 响应和 DELETE 方法【英文标题】:Rails ajax response and DELETE method 【发布时间】:2014-10-12 06:58:09 【问题描述】:

我在使用 Rails 4 中的 delete 方法进行远程链接时遇到问题

每当我有这样的链接时

<%= link_to "delete this", delete_path, remote: true, method: :delete %>

当我点击它时,它会触发正确的destroy.js.erb 响应,但之后任何远程链接都没有任何反应。在服务器上确实发生了事情,因为我看到这些东西被渲染了,但在浏览器上什么都没有发生。这让我需要刷新页面才能让其他 UJS 请求正常工作。

这是 ujs 和删除的已知问题吗?

有没有办法强制所有destroy 操作在post 而不是delete 上?

更新:

根据我的测试,这仅在 chrome 中发生(也隐身),在 safari 中正常工作

用于删除的服务器日志

Started DELETE "/disc/12" for 127.0.0.1 at 2014-08-19 11:47:59 +0300
Processing by DiscController#destroy as JS
  Parameters: PARAMS
 // REVELVANT SQL WORKING
   (3.3ms)  COMMIT
  Rendered discs/destroy.js.erb (3.3ms)
  User Load (1.1ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 6  ORDER BY "users"."id" ASC LIMIT 1
Completed 200 OK in 96ms (Views: 18.7ms | ActiveRecord: 18.1ms)

destroy.js.erb

$("#disc-<%= @disc.id %>").hide('slow');

销毁操作

def destroy
  @disc = Disc.find params[:id]
  @disc.destroy
end

【问题讨论】:

由于一切似乎都在根据您的服务器日志进行渲染和工作,所以我认为您在 destroy.js.erb 中的 js 代码有问题。你能发布你的服务器日志和js代码吗 相关的 html 是否隐藏? 您在浏览器控制台中看到任何错误吗?您确定存在 js.erb 模板中使用的 id 元素吗? 没有错误,问题是下一个 UJS 请求(如通过帖子创建)在服务器上触发,js 响应没有被渲染。如果我之前不发送删除请求,它可以正常工作 显示delete 操作。 【参考方案1】:

销毁后,您不会在视图中找到@disc.id,即。 destroy.js.erb。这就是为什么您不会在视图侧看到任何反射。将已删除的元素 id 保存在控制器中的任何实例变量中,然后尝试使用该变量值而不是已删除的对象 id 添加隐藏内容。

【讨论】:

【参考方案2】:

尝试在 rails 4 中禁用 turbolinks

如果我们创建一个新的 Rails 4 应用程序并决定不使用 Turbolinks,我们可以通过注释掉 gemfile 中的 gem 和应用程序的 JavaScript 清单文件中的 require 语句来轻松删除它。

【讨论】:

以上是关于Rails ajax 响应和 DELETE 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Rails RESTful Web 服务中接受 PUT 和 DELETE 方法

在 Rails 响应中发送一些初步数据

Rails:使用 ajax 与较长的 http 响应时间作斗争。这是个好主意吗?请帮助提供实施细节

Ruby on Rails,json vs js ajax 响应

jQuery ajax 请求不会触发 Rails 控制器的 JS 响应?

带有 Rails UJS 的 jQuery Mobile 在使用 data-method="delete" 的链接上尊重 data-ajax="false"