Rails通过JS渲染局部视图时出现Uncaught SyntaxError: Unexpected token <错误
问题根源与解决方案
这个错误的核心原因是请求处理流程和JS方法使用都出现了偏差,导致浏览器误把返回的HTML当成JavaScript代码解析,自然会把<判定为非法的JS语法。下面一步步拆解问题和修复方案:
1. 控制器的响应逻辑错误
你的check_it动作里,明明声明了format.js,却直接渲染partial并指定content_type: 'text/html'——这完全搞错了JS响应的逻辑!当请求.js格式时,Rails应该自动渲染对应的check_it.js.erb模板(也就是你写的那个JS文件),而不是直接返回HTML。直接返回HTML的话,浏览器会把这段HTML当成JS代码执行,第一个<自然就成了非法语法。
修正后的控制器代码:
def check_it @part = Part.find(params[:id]) # 确保@part被正确赋值,根据你的业务调整参数 respond_to do |format| format.js # 无需额外指定render,Rails会自动匹配check_it.js.erb end end
2. JavaScript方法使用错误
你用了$("#that_one").replace(...),但jQuery的replace()是用来替换字符串的,不是替换DOM元素内容的。要更新目标元素的HTML内容,应该用html()方法;如果要替换整个元素本身,才用replaceWith()。
修正后的check_it.js.erb:
$("#that_one").html("<%= j render(partial: 'check_it') %>");
这里的j(escape_javascript的简写)是必须的,它会把HTML里的换行、引号等特殊字符转义,避免破坏JS字符串的结构,防止出现语法错误。
3. 局部视图的小优化(可选)
你的HAML局部视图里,判断集合为空的方式可以更符合Ruby习惯,同时给无数据提示加个容器,让页面样式更统一:
- if @part.part_structures.empty? <p class="text-muted">No components</p> - else %table.table.table-sm %thead %tr %th Part # %th Description %th Qty %tbody - @part.part_structures.each do |ps| %tr %td= ps.component.partNo %td= ps.component.description %td= ps.qty
正常流程梳理
当用户触发check_it的JS请求时:
- 控制器响应
format.js,渲染check_it.js.erb模板 - 模板里渲染局部视图的HTML,并用
j转义后,通过html()方法插入到#that_one元素中 - 浏览器执行返回的JS代码,正确更新页面内容,不会再把HTML当成JS解析
内容的提问来源于stack exchange,提问作者Beengie
相关产品推荐
相关产品推荐

