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

在Rails中如何将ERB局部模板内的JavaScript对象转换为JSON返回

现有实现的问题

你当前的写法存在几个明显缺陷:

  • 硬编码模板文件路径,后续调整目录结构或者部署到不同环境容易出错
  • 直接用eval执行字符串有严重安全风险,只要模板内容包含不可信输入就可能触发任意代码执行
  • 手动初始化的ERB没有绑定当前控制器的执行上下文,后续如果新增其他实例变量注入很容易出现变量找不到的问题

推荐方案(优先选择)

最合理的做法是把图表配置抽成公共的Ruby Hash,视图渲染和JSON接口共用这一份数据源,从根源避免重复维护模板和安全风险:

  1. 抽取公共配置生成逻辑,比如放到Helper中:
# app/helpers/chart_config_helper.rb
module ChartConfigHelper
  def generate_chart_config(animation)
    {
      chart: {
        animation: animation
      },
      plotOptions: {
        # 把你原有_chart.js.erb里的所有配置都挪到这里
      }
    }
  end
end
  1. 修改原有_chart.js.erb,直接调用公共方法生成内容:
<%= generate_chart_config(@animation).to_json.html_safe %>
  1. JSON接口直接返回配置即可,不需要再处理模板:
respond_to do |format|
  format.json { render json: generate_chart_config(@animation) }
end

兼容方案(不修改原有模板的情况下)

如果不想改动现有模板的内容,可以用Rails原生渲染器加JSON5解析实现,比你原有写法安全很多:

  1. 先把json5 gem加入Gemfile并执行bundle install,用来解析宽松格式的JS对象(支持键不加双引号、尾逗号等JS语法)
  2. 接口逻辑修改为:
respond_to do |format|
  format.json {
    # 调用Rails原生渲染逻辑,自动处理模板路径和实例变量绑定
    js_config_str = render_to_string(partial: 'trades/chart', formats: [:js])
    # 用JSON5解析JS对象为Ruby Hash,不会执行任意代码
    config_hash = JSON5.parse(js_config_str)
    render json: config_hash
  }
end

最简方案

如果可以调整原有模板的写法,直接把模板内容改成合法JSON格式(键加双引号、变量输出时主动转JSON),渲染后直接就是合法JSON,不需要额外解析:
修改_chart.js.erb内容:

{
    "chart": {
        "animation": <%= @animation.to_json %>
    },
    "plotOptions": {
       ...
    }
}

接口直接渲染模板即可:

respond_to do |format|
  format.json { render partial: 'trades/chart', formats: [:js] }
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:51:04