在Rails中如何将ERB局部模板内的JavaScript对象转换为JSON返回
现有实现的问题
你当前的写法存在几个明显缺陷:
- 硬编码模板文件路径,后续调整目录结构或者部署到不同环境容易出错
- 直接用
eval执行字符串有严重安全风险,只要模板内容包含不可信输入就可能触发任意代码执行 - 手动初始化的ERB没有绑定当前控制器的执行上下文,后续如果新增其他实例变量注入很容易出现变量找不到的问题
推荐方案(优先选择)
最合理的做法是把图表配置抽成公共的Ruby Hash,视图渲染和JSON接口共用这一份数据源,从根源避免重复维护模板和安全风险:
- 抽取公共配置生成逻辑,比如放到Helper中:
# app/helpers/chart_config_helper.rb module ChartConfigHelper def generate_chart_config(animation) { chart: { animation: animation }, plotOptions: { # 把你原有_chart.js.erb里的所有配置都挪到这里 } } end end
- 修改原有
_chart.js.erb,直接调用公共方法生成内容:
<%= generate_chart_config(@animation).to_json.html_safe %>
- JSON接口直接返回配置即可,不需要再处理模板:
respond_to do |format| format.json { render json: generate_chart_config(@animation) } end
兼容方案(不修改原有模板的情况下)
如果不想改动现有模板的内容,可以用Rails原生渲染器加JSON5解析实现,比你原有写法安全很多:
- 先把
json5gem加入Gemfile并执行bundle install,用来解析宽松格式的JS对象(支持键不加双引号、尾逗号等JS语法) - 接口逻辑修改为:
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
相关产品推荐
相关产品推荐

