Rails 7.1.2:验证失败返回422状态后JavaScript停止工作
问题原因分析
你的问题出在Turbo对非成功响应(如422状态)的处理逻辑和Turbolinks不同,导致JavaScript初始化函数没有被正确触发:
- 若表单通过Turbo提交(即使你加了
local: true,可能存在配置冲突导致Turbo仍介入),当返回422时,Turbo会替换页面内容但不会触发turbo:load事件,而是触发turbo:render事件; - 若表单是普通HTTP提交(全页面刷新),仅监听
turbo:load可能覆盖不全,需要同时监听原生的DOMContentLoaded事件; - 页面重新渲染后,之前绑定的日历实例可能残留,导致新元素无法正确绑定。
解决方案
修改你的JavaScript代码,同时监听多个事件,并在初始化前销毁旧的日历实例:
// 监听所有可能的页面加载/渲染事件 document.addEventListener("DOMContentLoaded", initializeBulmaCalendarPicker); document.addEventListener("turbo:load", initializeBulmaCalendarPicker); document.addEventListener("turbo:render", initializeBulmaCalendarPicker); window.initializeBulmaCalendarPicker = function() { // 先销毁已存在的日历实例,避免重复绑定 bulmaCalendar.destroy('[type="date"]'); // 重新绑定日历选择器 var datePickers = bulmaCalendar.attach('[type="date"]', { overlay: true, lang: 'fr' // 保留你的其他配置项 }); }
额外检查项
- 确认表单的
local: true和data: {turbo: false}是否生效:可以在浏览器开发者工具中查看表单元素,确认是否带有data-turbo="false"属性; - 若使用Rails的Importmaps或Webpack,确保
bulmaCalendar库在全局作用域可访问,或在初始化函数中正确导入; - 控制器返回
render :new, status: :unprocessable_entity的逻辑是正确的,无需修改。
内容的提问来源于stack exchange,提问作者Bhupendra Singh
相关产品推荐
相关产品推荐

