gpt4 book ai didi

来自哈希的 Ruby .erb 模板,但捕获未设置的变量

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:40 24 4
gpt4 key购买 nike

我是一个 Ruby 新手,但我正在尝试使用脚本和大量合成数据(我会将其放入 Yaml 文件或其他文件)来呈现 Puppet .erb 模板。我们的人偶模板主要遵循以下几类:

# Some config file
<%= @some_ordinary_variable %>
<%= some_other_variable %>
<%= @something_undefined %>
<%= scope.function_hiera("some_hiera_variable") %>

我已经模拟了 hiera 查找,并找到了 Problem using OpenStruct with ERB作为替代“some_other_variable”的一种方式(我有点坚持让“@some_ordinary_variable”工作,但我想我可以解决这个问题。

我想问的是如何使用绑定(bind)让我在每次变量查找时运行一些代码?我想我想运行类似的东西:

def variable_lookup(key)
if @variables.has_key?(key)
return @variables[key]
else
warn "The variable " + key + " is required by the template but not set"
end
end

然后我可以将其与我的 Hiera 模型合并以查找 Hiera 数据。到目前为止我的代码是:

require 'rubygems'
require 'yaml'
require 'erb'
require 'ostruct'

class ErbBinding < OpenStruct
include Enumerable
attr_accessor :yamlfile, :hiera_config, :erbfile, :yaml

def scope
self
end

def function_hiera(key)
val = @yaml['values'][key]
if val.is_a?(YAML::Syck::Scalar)
return val.value
else
warn "erby: " + key + " required in template but not set in yaml"
return nil
end
end

def get_binding
return binding()
end
end

variables = {'some_other_variable' => 'hello world'}

hs = ErbBinding.new(variables)
template = File.read('./template.erb')
hs.yaml = YAML.parse( File.read('./data.yaml') )

erb = ERB.new(template)

vars_binding = hs.send(:get_binding)
puts erb.result(vars_binding)

我不知道如何设置运行代码的绑定(bind),而不是仅仅使用“变量”散列。有什么想法吗?

最佳答案

事实证明这非常简单!我发现您可以使用特殊方法“method_missing”来收集所有未定义的方法调用。也就是说,我们正在使用绑定(bind)将散列生成一个对象(每个散列键成为对象中的一个方法)。如果缺少方法(即哈希中没有设置键),那么 Ruby 会调用“method_missing”——我所做的只是说明缺少的方法名称。如果在这里找到重要信息:http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

如果您想知道,这是我到目前为止的全部代码...

require 'rubygems'
require 'yaml'
require 'erb'
require 'ostruct'

class ErbBinding < OpenStruct
include Enumerable
attr_accessor :yamlfile, :hiera_config, :erbfile, :yaml

def method_missing(m, *args, &block)
warn "erby: Variable #{m} required but not set in yaml"
end

def scope
self
end

def function_hiera(key)
val = @yaml['values'][key]
if val.is_a?(YAML::Syck::Scalar)
return val.value
else
warn "erby: " + key + " required in template but not set in yaml"
return nil
end
end

def get_binding
return binding()
end
end

variables = {'some_other_variable' => 'hello world'}

hs = ErbBinding.new(variables)
template = File.read('./template.erb')
hs.yaml = YAML.parse( File.read('./data.yaml') )

erb = ERB.new(template)

vars_binding = hs.send(:get_binding)
puts erb.result(vars_binding)

这段代码仍然不会处理像 <%= @variable %> 这样的模板,但它会处理我原来问题中的其他两种情况。

关于来自哈希的 Ruby .erb 模板,但捕获未设置的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14851549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com