3

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

我发现安装了erb:

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

它与红宝石一起安装:

# 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并且它有效。请查看马特的评论以获取更多详细信息。

4

2 回答 2

3

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

尝试将您的文件重命名为类似的名称erb_testing.rb,以便在您需要时erb不会混淆不同的文件。

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

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

于 2013-10-04T13:33:39.150 回答
0

听起来你的红宝石安装不知何故坏了。如果您真的想使用系统 ruby​​,为什么不尝试删除 ruby​​ 然后重新安装它,例如apt-get -y remove ruby && apt-get -y install ruby.

另一种选择是使用 Ruby 版本管理器(RVM,请参阅http://rvm.io/)并利用它在您的机器上安装干净的 ruby​​ 解释器。RVM 实际上是当今使用 ruby​​ 的推荐方式,因为大多数发行版都在其软件包中提供了一些陈旧的 ruby​​ 解释器。

于 2013-10-04T11:30:28.843 回答