Rails应用因Turbolinks加载问题导致页面自动刷新
嘿,这个问题我之前踩过坑!控制台的报错已经把根因说得明明白白——你把Turbolinks的脚本放在<body>标签里了,这完全不符合它的工作逻辑,才导致页面莫名其妙自动刷新。
为什么会出现这个问题?
Turbolinks的核心是通过替换页面<body>内容实现无刷新跳转,它默认只会在页面首次加载时执行<head>里的脚本。但如果你的Turbolinks脚本(或者整个JS bundle)放在<body>里,每次Turbolinks切换页面时,这个脚本都会被重新执行一遍,直接触发不必要的页面刷新,甚至会造成循环刷新的尴尬情况。
具体修复步骤:
检查布局文件(通常是
app/views/layouts/application.html.erb)
找到加载JS的<script>标签,把它从<body>区域移到<head>标签内。正确的写法应该是这样:<head> <!-- 这里放meta标签、样式表、页面标题等内容 --> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head>别担心,放在
<head>里不会影响页面加载速度,Turbolinks本身就做了优化。确认
application.js的引入方式
打开app/assets/javascripts/application.js,确保你是通过//= require turbolinks来引入Turbolinks的,而不是在页面里手动单独添加Turbolinks的脚本标签。这样Rails的资产管道会把它打包到主JS文件里,跟着主文件一起在<head>加载,避免重复执行。排查第三方脚本冲突
如果移动脚本后还是有问题,检查页面里其他的自定义或第三方脚本。有些脚本和Turbolinks不兼容,需要给它们加上data-turbolinks-eval="false"属性,告诉Turbolinks不要在每次页面切换时重新执行这些脚本:<script data-turbolinks-eval="false"> // 这里放不需要每次页面切换都执行的脚本逻辑 </script>
按这几步操作后,页面自动刷新的问题应该就能解决了!
内容的提问来源于stack exchange,提问作者SébastienR

