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:使用 ajax 与较长的 http 响应时间作斗争。这是个好主意吗?请帮助提供实施细节
Ruby on Rails,json vs js ajax 响应
jQuery ajax 请求不会触发 Rails 控制器的 JS 响应?
带有 Rails UJS 的 jQuery Mobile 在使用 data-method="delete" 的链接上尊重 data-ajax="false"