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

如何在ERB中嵌套调用ERB?嵌套输出内容丢失问题咨询

嵌套ERB输出异常的原因及解决方法

问题原因

默认情况下,ERB的result方法会直接将渲染内容输出到标准输出($stdout),而非返回字符串。当你在外层ERB的<%= %>标签里调用内层ERB的result时,内层内容会直接打印到控制台,而<%= %>实际插入的是result方法的返回值(nil),导致外层模板的前置内容被内层输出干扰,最终出现不符合预期的结果。

解决方法

嵌套ERB是完全可行的,只需正确捕获内层ERB的输出,避免直接写入全局输出流:

1. 纯Ruby环境下的捕获方式

使用StringIO捕获内层ERB的输出,将其转为字符串后再插入外层模板:

require 'stringio'

template = "1. <%= begin
  out_buf = StringIO.new
  ERB.new('2').result(binding, out_buf)
  out_buf.string
end %>. 3"

puts ERB.new(template).result(binding)
# 输出:1. 2. 3

2. Rails框架中的简化方式

Rails视图上下文提供了capture方法,可直接捕获ERB块的输出:

# Rails视图模板中
1. <%= capture { ERB.new('2').result(binding) } %>. 3

渲染后会得到预期的1. 2. 3。

3. 手动处理ERB源码(进阶方式)

通过ERB生成的源码,结合eval直接获取渲染结果字符串:

inner_erb = ERB.new('2')
inner_result = eval(inner_erb.src, binding, __FILE__, __LINE__)

template = "1. <%= inner_result %>. 3"
puts ERB.new(template).result(binding)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:22:18