Rails 5中remote: true返回的JS被包裹在HTML模板中
解决Rails UJS删除链接渲染JS模板到HTML布局的问题
我来帮你搞定这个问题——你点击删除链接后,记录虽然成功删除,但destroy.js.erb的代码被裹进了全站HTML布局里,导致浏览器把它当普通文本显示,根本没执行预期的JS动画对吧?咱们一步步来修复:
核心问题:JS模板被错误加载了全站布局
最可能的原因是你的destroy动作在渲染JS模板时,意外使用了application全局布局(也就是网站的头部、导航这些通用结构)。Rails默认渲染JS模板时是不加载布局的,但如果你的控制器全局设置了布局,或者有其他配置覆盖了这个默认行为,就会出现这种情况。
解决方案1:在destroy动作里单独禁用布局
修改你的AddressesController的destroy方法,明确指定渲染JS时不使用布局:
class AddressesController < ApplicationController # ...其他代码 def destroy @address = Address.find(params[:id]) @address.delete respond_to do |format| format.js { render layout: false } # 关键:禁用布局,只返回纯JS代码 end end end
解决方案2:全局为控制器的JS动作禁用布局
如果你的AddressesController里还有其他JS动作也需要无布局渲染,可以在控制器顶部统一设置:
class AddressesController < ApplicationController layout false, only: [:destroy] # 仅对destroy动作禁用全局布局 # ...其他代码 end
额外排查点
如果上面的方法没解决问题,再检查这两个细节:
- 确认请求头是否正确:打开浏览器开发者工具的Network面板,查看删除请求的
Accept头,应该包含text/javascript——因为remote: true会让UJS自动设置这个头,确保控制器能识别出要返回JS格式。 - Turbolinks兼容性:如果你的项目使用了Turbolinks,可以给删除链接加上
data-turbolinks="false"试试:= link_to address, method: :delete, data: { confirm: 'Are you sure?', turbolinks: false }, remote: true, class: "small button" do i.fa.fa-trash
这样修改后,destroy.js.erb就会以纯JS代码返回,浏览器会正确执行它,你的删除动画就能正常工作啦!
内容的提问来源于stack exchange,提问作者greyoxide
相关产品推荐
相关产品推荐

