使用smart_listing gem遇ExecJS::RuntimeError错误求解决方案
看起来你遇到的是smart_listing和Rails默认的Asset Pipeline、Turbolinks之间的兼容性问题——删掉那些asset标签能运行,但显然这不是长久之计,咱们一步步来解决:
第一步:先修复重复的JS引用
你的application.html.erb里重复加载了两次application.js:
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag "application" %>
重复加载JS文件很容易导致变量冲突、初始化异常,先删掉其中一行,保留带data-turbolinks-track的那行即可:
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
第二步:确保smart_listing的Assets正确引入
smart_listing需要自己的CSS和JS文件才能正常工作,你需要确认这些文件已经加入到你的Asset Pipeline中:
- 在
app/assets/stylesheets/application.css里添加:*= require smart_listing *= require_tree . *= require_self - 在
app/assets/javascripts/application.js里添加:
注意顺序:turbolinks要在smart_listing之前加载,这样才能正确处理页面加载事件。//= require turbolinks //= require smart_listing //= require_tree .
第三步:解决Turbolinks与smart_listing的初始化冲突
Turbolinks会让页面以AJAX方式加载,这可能导致smart_listing的JS组件(排序、分页)没有正确初始化。你可以试试以下两种方案:
方案A:为目标页面禁用Turbolinks
在跳转到distribs#index的链接上添加data-turbolinks="false",比如:
= link_to '查看联系人', distribs_path, data: { turbolinks: false }
这样页面会以传统方式加载,确保smart_listing的JS能正常初始化。
方案B:在Turbolinks加载事件中重新初始化smart_listing
创建一个新的JS文件app/assets/javascripts/smart_listing_turbolinks.js,添加以下代码:
document.addEventListener('turbolinks:load', function() { // 重新初始化所有smart_listing组件 if (window.SmartListing) { SmartListing.init(); } });
然后在application.js里引入这个文件:
//= require turbolinks //= require smart_listing //= require smart_listing_turbolinks //= require_tree .
这样每次Turbolinks加载页面时,都会重新初始化smart_listing的功能。
第四步:调试具体错误
如果以上方法都没用,打开浏览器的开发者工具(F12),切换到Console标签页,查看具体的JS错误信息——比如是否有SmartListing is not defined、函数重复定义等问题,这些信息能帮你精准定位冲突点。
另外,检查你的_list.html.haml模板:确保smart_listing.paginate和smart_listing.pagination_per_page_links是在table标签外面,不要嵌套在tbody或thead里,HAML的缩进错误也可能导致渲染异常。
内容的提问来源于stack exchange,提问作者user9680695

