如何通过 ERB.result_with_hash 传递绑定

How to pass binding with ERB.result_with_hash

我以前只是这样传递绑定

class GenerateFiles
  def is_xyz(abcd)
    return abcd
  end

  def render_template(fileName, binding)
    template = ERB.new File.read("templates/#{fileName}"), nil, "%"
    template.result(binding)
  end
end

但是,我还有一些其他数据想要传递(称为 args,这是一个哈希),因此我进行了更改以使用新的 result_with_hash(args) 函数进行渲染。

使用 result_with_hash,我的模板只能访问 args 中的变量,而不能访问 binding

我怎样才能同时通过这两项?

我试过了

ERB.new(template).result(OpenStruct.new(args).instance_eval { binding })

但我遇到了错误,因为模板无法通过绑定访问作用域中的函数 is_xyz。我在像 <%= is_xyz abcd %> 这样的模板中使用了它,并且在我只传递绑定之前它工作得很好。

在您的情况下,如果您需要同时使用 argsbinding,则需要将 args 的 keys/values 填充到绑定对象中。

# To avoid polluting your current binding, copy to a new one
b_clone = binding.clone
args.each { |k, v| b_clone.local_variable_set(k,v) }
ERB.new(template).result(b_clone)

因此您可以在绑定中使用这两种方法,并在 args 中使用 keys/values 作为变量