【问题标题】:ruby erb template syntax error from a script来自脚本的 ruby​​ erb 模板语法错误
【发布时间】:2013-08-12 14:59:08
【问题描述】:

我有以下 my_script.ruby

require 'erb'
require 'ostruct'
namespace = OpenStruct.new(:jmx_port => 9200, :markets=> ['CH', 'FR'])
template = File.open("my.json.erb", "rb").read;
puts ERB.new(template).result(namespace.instance_eval { binding })

和 my.json.erb:

{
  "servers" : [ {
    "port" : "<%= jmx_port %>",
    "host" : "localhost",

    "queries" : [
      <% @markets.each do |market| -%>
    {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter",
      } ],
      "obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache",
      "attr" : [ "hits","hitratio"]
    },
    <% end -%>
    ],
    "numQueryThreads" : 2
  } ]
}

但是通过irb my_script.ruby 执行脚本我得到这个错误:

?> puts ERB.new(template).result(namespace.instance_eval { binding })
SyntaxError: compile error
(erb):10: syntax error, unexpected ';'
;  @markets.each do |market| -; _erbout.concat "\n      "

                           ^

对于上下文,my.json.erb 文件是一个 puppet 文件, 并使用 my_script.ruby 我正在尝试验证文件是否正确,然后再将其发送给 puppet。

我做错了什么?

ps:这里是 erb 模板,供 puppet 使用: http://docs.puppetlabs.com/guides/templating.html

【问题讨论】:

    标签: ruby erb


    【解决方案1】:

    你的erb有几个问题:

    • 对于不想输出的内容,应使用&lt;% %&gt; 而不是&lt;% -%&gt;。
    • 由于您使用的是OpenStruct,因此您应该使用markets 而不是@markets

    这是my.json.erb 文件的最终版本:

    {
      "servers" : [ {
        "port" : "<%= jmx_port %>",
        "host" : "localhost",
    
        "queries" : [
          <% markets.each do |market| %>
        {
          "outputWriters" : [ {
            "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter",
          } ],
          "obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache",
          "attr" : [ "hits","hitratio"]
        },
        <% end %>
        ],
        "numQueryThreads" : 2
      } ]
    }
    

    【讨论】:

    • 大卫是正确的。为什么我们不能使用 我看到 ruby​​ doc ruby-doc.org/stdlib-2.0/libdoc/erb/rdoc/ERB.html 语法可用
    • @KitHo 是 ruby​​ 2.0 的新手。你用的是什么版本?
    • ruby 1.9.3 似乎你是正确的ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html 它没有提供 可能,木偶默认提供 ,这就是为什么 OP 有如果他纯粹在 ruby​​ 中使用 1.9.3 会出现问题
    • 谢谢,明天我将升级ruby 2.0并再次测试它;关于写markets而不是@markets,你能详细说明一下吗?我的目标是验证人偶配置,这需要使用@markets。
    • @DavidPortabella OpenStruct 就像一个 ruby​​ 哈希的包装器,它为您提供友好的访问器方法,在您的情况下是 markets 和 jmx_port。 OpenStruct 中没有实例变量。在您的情况下,这意味着您只能使用 markets 方法访问市场数组。没有名为 @markets 的实例变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多