在 ruby 中创建 Javascript 类似 Mustache Helpers (Lambda) 函数

Create Javascript like Mustache Helpers (Lambda) functions in ruby

我找不到任何文档或示例来创建 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"}}]}