问题描述
我找不到任何文档或示例来创建 Mustache Lambda,它可以访问当前上下文并创建像 lambda 助手一样的 mustache js。
http://mustache.github.io/mustache.5.html
解决方法
在查看 Mustache 库代码后,我发现可以使用 context.current
访问当前上下文并使用它递归调用 render
方法。
这是实现它的方法。希望能帮到其他人。
class MustacheTemplateHelper < Mustache
self.raise_on_context_miss = true
def context
super
end
def self.render(expression,replacementContext = {})
new.render(expression,replacementContext)
end
def render(expression,replacementContext = {})
replacementContext = replacementContext.merge(self.class.helperMethod(context))
super
end
def self.helperMethod(context)
return lambdaMethods = Hash[
"ToYaml" => lambda do | expression |
# this statement renders the string part between ToYaml tags
renderedString = render(expression,context.current) # context.current contains current context
startIndentationSize = renderedString[/\A */].size
return JSON.parse(renderedString.gsub('=>',':').gsub(":nil,",":null,"))
.to_yaml().delete_prefix("---\n").indent(startIndentationSize)
end
]
end
模板:
{{#configs}}
- name: {{{name}}}
inputs:
{{#ToYaml}}
{{{parameters}}}
{{/ToYaml}}
{{/configs}}
示例配置:
{"configs"=>[{"name"=>"Test1","parameters"=>{"param1"=> "demo1","param2"=>"demo2"}},{"name"=>"Test2","parameters"=>{"param3"=> "demo3","param4"=>"demo4"}}]}