如何在ruby代码中使用erb模板

时间:2013-10-04 09:29:50

标签: ruby

我想使用ruby的erb模板功能。但我无法运行提供的示例代码。

我发现安装了erb:

# file /usr/lib/ruby/1.9.1/erb.rb
/usr/lib/ruby/1.9.1/erb.rb: ASCII English text

它与ruby一起安装:

# dpkg -S /usr/lib/ruby/1.9.1/erb.rb
libruby1.9.1: /usr/lib/ruby/1.9.1/erb.rb

我正在/usr/lib/ruby/1.9.1/erb.rb

中提供的示例代码下面运行
#!/usr/bin/ruby
require 'erb'
x = 42
template = ERB.new <<-EOF
  The value of x is: <%= x %>
EOF
puts template.result(binding)

运行代码时出现以下错误:

/workspace/ruby/erb.rb:4:in `<top (required)>': uninitialized constant ERB (NameError)
    from /workspace/ruby/erb.rb:2:in `require'
    from /workspace/ruby/erb.rb:2:in `<main>'

问题:上面的代码中缺少什么?

这是我的平台:

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 10.04.4 LTS
Release:    10.04
Codename:   lucid

# uname -m
i686

和我的红宝石版本:

# ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i486-linux]

解答:

@ matt的评论是对这个问题的回答。我将我的脚本命名为erb.rb,这就是问题所在。我将其重命名为testing_erb.rb并且有效。请查看matt的评论以获取更多详细信息。

2 个答案:

答案 0 :(得分:2)

您的测试文件名为erb.rb。在Ruby 1.9.1中,当前目录位于加载路径上,因此当您调用require 'erb'时,它会尝试本身。由于文件未定义ERB,因此在尝试使用该常量时会出现uninitialized constant错误。

尝试将文件重命名为erb_testing.rb,以便在需要erb时,不同文件之间不会混淆。

请注意,在Ruby(1.9.2+)的更高版本中,当前目录不在默认加载路径中,因此您不会看到这样的问题。看起来升级你的Ruby版本可能是值得的,因为1.9.1现在很老了(2.1应该很快发布,而1.9.1将会落后四个版本)。如果您的软件包管理器没有更新的版本,请查看RVM

需要注意的一点是,此错误取决于加载路径中条目的顺序。在我安装1.9.1时,当前目录是 last 条目,因此当需要erb时,首先会看到标准库中的版本并加载,并且没有错误。看起来您的安装将当前目录放在标准库之前 - 我不知道为什么会这样。

答案 1 :(得分:0)

听起来你的红宝石装置有点破碎了。如果你真的想使用系统ruby,为什么不尝试删除ruby然后重新安装,例如apt-get -y remove ruby && apt-get -y install ruby

另一种选择是使用Ruby Version Manager(RVM,请参阅http://rvm.io/)并利用它来为您的盒子安装干净的ruby解释器。 RVM实际上是现在使用ruby的推荐方式,因为大多数发行版都在它们的包中提供了一些老化的ruby解释器。