【问题标题】:How do I Make a Constant from a Gem Available in Controller如何在控制器中使用 Gem 生成常量
【发布时间】:2012-05-21 23:12:47
【问题描述】:

我觉得这是一个愚蠢的问题,但我花了一些时间试图弄清楚并在谷歌上搜索它,但无济于事。我正在尝试在控制器中使用 Ruby Gem。我已将它包含在我的 Gemfile 中,运行 bundle install,看到它出现在我的 gems 列表中,重新启动了我的本地服务器。但不知何故,每当我尝试调用 gem (rails_rrdtool) 它只是告诉我

uninitialized constant RrdgraphsController::RRD
app/controllers/rrdgraphs_controller.rb:22:in `show'

我的代码中假发的位置是我打电话的时候

RRD.graph

就好像它不知道 gem 到底在哪里……但是,我可以使用 require 将它成功导入到 irb 会话中。所以我知道它是有效的,它只是无法进入其中......

Bundler 应该处理我假设的 gem 的包含。我在错误的地方调用它吗?

【问题讨论】:

  • 它是什么宝石?您需要在常量前面加上正确的类。现在它认为它是在 RrdgraphsController 类中定义的。我认为这是一个命名空间问题。
  • 别在意上面的评论,我没有意识到这也是 gem 的名称。我认为它只是在 gem 内部定义的一个常量。用 :: 作为前缀来尝试让它看起来在当前类之外呢? ::RRD.graph
  • @jstim 哇哦!这似乎已经做到了:) 我想知道它是否需要某种前缀,但不认为它只适用于 :: 如果您将其作为答案提交,我会给您一个批准印章!谢谢!
  • 我想知道 Ruby 是否因为类名都是大写而感到困惑。如果是一个叫Rrd的班级,我不知道它是否还会发疯。

标签: ruby-on-rails-3 rubygems ruby-on-rails-3.2


【解决方案1】:

这看起来像是一个命名空间问题。您的错误表明它正在寻找当前类内部的常量:RrdgraphsController::RRD,它应该在当前上下文之外寻找一个类。

尝试在类名前加上一个双冒号来完整定义类的位置。

::RRD.graph #rest of your code

this other accepted answer 中有一个很好的类比。基本上它创建了一个绝对路径,所以 Ruby 不必猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多