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

如何将Ruby ActiveRecord对象传入JavaScript函数?

解决ActiveRecord对象传入JavaScript函数的语法错误问题

我来帮你搞定这个问题!你遇到的Uncaught SyntaxError大概率是两个小细节没处理好,咱们一步步来修正:

首先排查ERB变量赋值的问题

你代码里第一行写的:

= label = @label // active record object

这里的=会把@label的字符串表示(比如#<Label:0x00007fxxxx>这种ActiveRecord对象的默认输出)直接渲染到HTML页面里,这不仅会在页面上显示一堆没用的内容,还会破坏后续JavaScript代码的结构,导致浏览器解析时出错。

应该改成不输出的赋值语句,用-替代=:

- label = @label // 只赋值变量,不输出到页面

修正后的完整ERB代码

调整后,你的代码应该变成这样:

- label = @label # 正确赋值,不输出
- @x = 5
= javascript_tag "alert(#{ j(@x.to_json)});" # 正常工作
= javascript_tag "proj.app.custom(#{ j(label.to_json)})" # 现在可以正常运行了

更稳妥的替代方案(推荐)

如果不想把JSON直接嵌入到JavaScript代码里,还有一种更清晰、不易出错的方式:把ActiveRecord对象的JSON数据存到HTML元素的data-*属性中,再用JavaScript读取:

<!-- 把JSON数据存在隐藏的DOM元素里 -->
<div id="label-container" style="display: none;" data-label="<%= j(@label.to_json) %>"></div>

= javascript_tag do
  // 从DOM属性读取并解析JSON
  const labelData = JSON.parse(document.getElementById('label-container').dataset.label);
  // 调用你的函数
  proj.app.custom(labelData);

这种方式把数据和代码分离,能避免很多ERB与JavaScript混合时的转义问题,维护起来也更方便。

为什么之前会报错?

核心问题就是第一行的= label = @label输出了ActiveRecord对象的原始字符串表示,干扰了浏览器对JavaScript代码的解析。修正赋值语句后,j(label.to_json)就能正确生成转义后的JSON对象,传递给proj.app.custom函数时就不会有语法问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:32