You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求时:

  1. 控制器响应format.js,渲染check_it.js.erb模板
  2. 模板里渲染局部视图的HTML,并用j转义后,通过html()方法插入到#that_one元素中
  3. 浏览器执行返回的JS代码,正确更新页面内容,不会再把HTML当成JS解析

内容的提问来源于stack exchange,提问作者Beengie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:13:19