在 ruby 中创建 Javascript 类似 Mustache Helpers (Lambda) 函数
Create Javascript like Mustache Helpers (Lambda) functions in ruby
我找不到任何文档或示例来创建 Mustache Lambda,它可以访问当前上下文并创建像 lambda 助手一样的 mustache js。
通过 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"}}]}
我找不到任何文档或示例来创建 Mustache Lambda,它可以访问当前上下文并创建像 lambda 助手一样的 mustache js。
通过 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"}}]}