未初始化常量ActiveRecord(NameError)

14

我正在运行一段脚本(是一个我失去联系的朋友为我编写的)。它开头是这样的:

require 'ruby-debug'
require 'circle'

first_circle=Circle.new()
@number_of_rounds=1

但是我一直收到这个错误信息:

C:/Ruby193/lib/ruby/gems/1.9.1/gems/circle-0.0.2/lib/circle/models/friendship.rb:1:in
`<top (required)>': uninitialized constant ActiveRecord (NameError)
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
`require'
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
`require'
  from
C:/Ruby193/lib/ruby/gems/1.9.1/gems/circle-0.0.2/lib/circle/circle.rb:1:in
`<top (required)>'
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
`require'
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
`require'
  from
C:/Ruby193/lib/ruby/gems/1.9.1/gems/circle-0.0.2/lib/circle.rb:7:in
`<top (required)>'
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in
`require'
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in
`rescue in require'
  from
C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in
`require'
  from primes.rb:5:in `<main>'

我该怎么办?


你确定你已经安装了 gem 吗?gem install circle 应该已经安装了所有依赖项。 - Srikanth Venugopalan
3个回答

12

由于这个页面在谷歌搜索错误信息时排名第一,因此提醒一下,当尝试在 app/models/... 上运行 rspec 而不是 spec/models/... 时,可能会出现此错误消息。


12
这篇文章已经同时发布到ruby-talk
ActiveRecord是一个与数据库交互的类,这个gem期望在已经加载了ActiveRecord数据库连接的上下文中运行。如果你使用Rails,那就意味着需要加载你的Rails环境。如果只使用ActiveRecord,可以尝试以下操作:
require 'active_record'
require 'circle'

ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
ActiveRecord::Schema.define do
  self.verbose = false

  create_table :users do |t|
    t.string  :name
    t.integer :friends_count, :default => 0, :null => false
  end

  create_table :friendships, :force => true do |t|
    t.references :user, :friend
    t.datetime :requested_at, :accepted_at, :denied_at, :blocked_at
    t.string :status
    t.timestamps
  end

  create_table :blocked_users, :force => true do |t|
    t.references :user, :blocked_user
    t.timestamps
  end

  change_table :friendships do |t|
    t.index :user_id
    t.index :friend_id
    t.index :status
  end

  change_table :blocked_users do |t|
    t.index :user_id
    t.index :blocked_user_id
  end
end

class User < ActiveRecord::Base
  has_circle
end

john = User.create! name: 'john'
mary = User.create! name: 'mary'
paul = User.create! name: 'paul'

john.befriend(mary)
john.friends?(mary)               # => false
mary.accept_friend_request(john)
mary.friends?(john)               # => true

但是说实话,如果你不知道什么是ActiveRecord,那么这个gem似乎不太可能为你解决问题。此外,我对这个gem有点怀疑,它在迁移过程中存在拼写错误,除非你去修复它,否则它实际上不起作用。这个问题已经存在了至少7个月,却没有被修复。这个gem只有不到800次下载,这并不多(少用户=更少的人发现和修复错误),而且看起来作者也没有意图维护它。
好的,我刚意识到实际发生了什么。花了大约20分钟写上面的内容,它可能会帮助以后谷歌搜索问题的人,所以我会留下它。我怀疑真正发生的是,您在系统上有一个名为circle的gem,并且您可能在同一目录中有一个名为circle的文件。您的加载路径未正确设置,因此当您执行require 'circle'时,它会找到gem而不是您编写的文件。一个简单的答案是说,改用require File.dirname(__FILE__) + '/circle'而不是require 'circle'。这不是真正的答案,但它可以工作,而不必深入了解需要找出正确方法的众多细节。如果您想找出正确的方法,我需要知道您使用的Ruby版本、您打算如何使用和调用此代码以及您的目录结构是什么。
另外,如果您说circle.rb是同一目录中的文件,那么我就不会浪费20分钟看顶部的答案了。在未来,请提供足够的上下文来理解问题。

+1 选择在这里留言。@JonathanKav - 如果您有兴趣弄清楚这个问题,能否请您编辑您的问题并提供Joshua所要求的输入?至少可以在Github上提出问题。 - Srikanth Venugopalan
是的,这个问题并不是通用的,它非常特定于这个用户的代码库。 - Joshua Cheek

2
您需要做的是:
gem install activerecord

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接