我想使用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的评论以获取更多详细信息。
答案 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解释器。