目前我可以这样做:
r = ERB.new('Hi there <%= name %>')
r.result(OpenStruct.new(name: 'Joan').instance_eval{ binding })
# Outputs 'Hi there Joan'
但我也可以这样做(在带有Admin模型的Rails应用程序中运行):
r = ERB.new('<%= Admin.count %>')
r.result(OpenStruct.new.instance_eval{ binding })
# Outputs '10'
换句话说,它可以在调用评估的上下文中访问我的应用程序的所有变量。
有没有办法将变量的范围仅限于我在绑定中提供的范围,例如只有'名字'而没有别的?我想在面向用户的模板工具中使用它。
我也试过这个(根据另一个问题):
class Namespace
def initialize(hash)
hash.each do |key, value|
singleton_class.send(:define_method, key) { value }
end
end
def get_binding
binding
end
end
同样的结果。