如何在保持缩进的同时将 .yaml.erb 嵌入到另一个 .yaml.erb 中?
How to embed a .yaml.erb into another .yaml.erb while keeping indentation?
假设我有两个文件,parent.yaml.erb 和 child.yaml.erb,我想包括child.yaml.erb 的内容在 parent.yaml.erb 中并在 parent.yaml.erb 的上下文中计算。示例:
parent.yaml.erb:
name: parent
first:
second:
third: something
<%= ERB.new(File.read('child.yaml.erb')).result(binding) %>
child.yaml.erb:
<% if some_condition %>
a:
b:
c: <%= 2+2 %>
<% end %>
我期望这样的结果:
expected_result.yaml:
name: parent
first:
second:
third: something
a:
b:
c: 4
我得到的是:
result.yaml:
name: parent
first:
second:
third: something
*[whitespace ends here]*
a:
b:
c: 4
使用 documentation 中的 trim_mode 选项没有帮助。
如何使用正确的缩进实现预期结果?
ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-linux]
你可以这样做。
parent.yaml.erb
name: parent
first:
second:
third: something
<%- content = ERB.new(File.read("child.yaml.erb"), nil, "-").result().gsub(/^/," ") -%>
<%= content -%>
child.yaml.erb
<% if some_condition -%>
a:
b:
c: <%= 2+2 %>
<% end -%>
一些解释
- 我必须通过将
nil
和 "-"
作为第二个和第三个参数传递给 ERB.new()
来启用 trim 模式。
- 启用 trim 模式后,我可以 trim 不需要的白色 space 使用
<$-
和 -%>
。
- 我用
gsub
缩进了 4 spaces。
当然,如评论中所述,将 YAML 数据作为散列读入内存可能会更好,尽管我确实意识到这样会失去对输出的很多控制。
假设我有两个文件,parent.yaml.erb 和 child.yaml.erb,我想包括child.yaml.erb 的内容在 parent.yaml.erb 中并在 parent.yaml.erb 的上下文中计算。示例:
parent.yaml.erb:
name: parent
first:
second:
third: something
<%= ERB.new(File.read('child.yaml.erb')).result(binding) %>
child.yaml.erb:
<% if some_condition %>
a:
b:
c: <%= 2+2 %>
<% end %>
我期望这样的结果:
expected_result.yaml:
name: parent
first:
second:
third: something
a:
b:
c: 4
我得到的是:
result.yaml:
name: parent
first:
second:
third: something
*[whitespace ends here]*
a:
b:
c: 4
使用 documentation 中的 trim_mode 选项没有帮助。
如何使用正确的缩进实现预期结果?
ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-linux]
你可以这样做。
parent.yaml.erb
name: parent
first:
second:
third: something
<%- content = ERB.new(File.read("child.yaml.erb"), nil, "-").result().gsub(/^/," ") -%>
<%= content -%>
child.yaml.erb
<% if some_condition -%>
a:
b:
c: <%= 2+2 %>
<% end -%>
一些解释
- 我必须通过将
nil
和"-"
作为第二个和第三个参数传递给ERB.new()
来启用 trim 模式。 - 启用 trim 模式后,我可以 trim 不需要的白色 space 使用
<$-
和-%>
。 - 我用
gsub
缩进了 4 spaces。
当然,如评论中所述,将 YAML 数据作为散列读入内存可能会更好,尽管我确实意识到这样会失去对输出的很多控制。