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

将哈希用作ERB模板时Ruby触发编码错误的问题咨询

Ruby哈希内ERB模板渲染解决方案

直接将哈希传入ERB.new会触发NoMethodError,原因是ERB的构造函数仅接受字符串(或实现to_str的对象),它会调用传入对象的encoding方法处理编码,而Hash类没有该方法。

要保留哈希结构完成ERB渲染,需要遍历哈希值,对包含模板的字符串单独处理:

基础版(处理单层哈希)

require 'erb'

def render_hash_erb(hash)
  hash.transform_values do |value|
    value.is_a?(String) ? ERB.new(value).result(binding) : value
  end
end

# 测试示例
c = {"id" => "això és una merda <%=rand(1..10)%>"}
render_hash_erb(c)
# 输出示例:{"id"=>"això és una merda 5"}

递归版(处理嵌套哈希)

如果哈希包含嵌套结构,可使用递归遍历处理:

def render_nested_hash_erb(hash)
  hash.transform_values do |value|
    case value
    when String
      ERB.new(value).result(binding)
    when Hash
      render_nested_hash_erb(value)
    else
      value
    end
  end
end

# 测试嵌套哈希
nested_c = {
  "id" => "això és una merda <%=rand(1..10)%>",
  "details" => {"num" => "número <%=rand(100..200)%>"}
}
render_nested_hash_erb(nested_c)
# 输出示例:{"id"=>"això és una merda 8", "details"=>{"num"=>"número 172"}}

关键说明

  • transform_values方法会创建新哈希,原哈希不会被修改;若需要修改原哈希,可改用transform_values!
  • 非字符串类型的哈希值会原样保留,不做ERB渲染处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:46:19