【发布时间】:2019-07-19 17:44:18
【问题描述】:
如果模板中缺少值,ruby ERB 类将静默继续。
例如 @config['bar'] 和 ENV['DOESNTEXIST'] 未定义。
require 'erb'
@config = {}
@config['foo'] = 42
template = ERB.new <<-EOF
FOO=<%= @config['foo'] %>
BAR=<%= @config['bar'] %>
LANG=<%= ENV['LANG'] %>
BAD=<%= ENV['DOESNTEXIST'] %>
EOF
template.result(binding)
输出
FOO=42
BAR=
LANG=en_US.UTF-8
BAD=
期望的输出
Warning: @config['bar'] is undefined
Warning: ENV['DOESNTEXIST'] is undefined
FOO=42
BAR=
LANG=en_US.UTF-8
BAD=
如果 ERB 模板具有 nil 或未定义值,是否有方法发出警告?
有没有办法在 erb 模板中显示所有变量,以便我可以遍历它们进行验证?
我不提前知道模板的所有值,因为用户可以指定自己的模板。
我尝试过的:
template.inspect 给了我一个显示占位符的字符串。我可以过滤子字符串,但这是不可靠的。
template.inspect
=> "#<ERB:0x00007ff4e50b1288 @safe_level=nil, @src=\"#coding:UTF-8\\n_erbout = +''; _erbout.<< \\\" FOO=\\\".freeze; _erbout.<<(( @config['foo'] ).to_s); _erbout.<< \\\"\\\\n BAR=\\\".freeze\\n; _erbout.<<(( @config['bar'] ).to_s); _erbout.<< \\\"\\\\n LANG=\\\".freeze\\n; _erbout.<<(( ENV['LANG'] ).to_s); _erbout.<< \\\"\\\\n BAD=\\\".freeze\\n; _erbout.<<(( ENV['DOESNT EXIST'] ).to_s); _erbout.<< \\\"\\\\n\\\".freeze\\n; _erbout\", @encoding=#<Encoding:UTF-8>, @frozen_string=nil, @filename=nil, @lineno=0>"`
更新:我承认这个问题的表述方式不是很清楚。问题的实质是如何将"@config['foo']" 之类的字符串转换为@config['foo'] 之类的变量?
我了解到这通常是使用已知问题的eval() 完成的。
相关问题:how can i avoid eval in this situation
【问题讨论】:
-
ERB 不会为您执行此操作。我建议编写某种
validate_config(@config)方法来进行检查。 -
很公平。我仍然需要以某种方式从模板中干净地获取变量。 'grep' 是最好的方法吗?
-
"用户可以指定自己的模板" ...您对这些用户的信任程度如何?因为这听起来很不安全
-
这是公司内部使用的命令行实用程序。与
helm template非常相似。用户定义整个配置文件,该实用程序只是帮助对其进行参数化。 -
一个更好的方法是通过 JSON 或者如果你需要 HTML 然后 XSLT