如何通过 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 %>
这样的模板中使用了它,并且在我只传递绑定之前它工作得很好。
在您的情况下,如果您需要同时使用 args
和 binding
,则需要将 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 作为变量
我以前只是这样传递绑定
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 %>
这样的模板中使用了它,并且在我只传递绑定之前它工作得很好。
在您的情况下,如果您需要同时使用 args
和 binding
,则需要将 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 作为变量