将哈希用作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
相关产品推荐
相关产品推荐

