13

私はスクリプトを実行しています (連絡を失った友人が私のために書いたものです)。スクリプトは次のように始まります。

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>'

私は何をすべきか?

4

3 に答える 3

11

これは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には少し懐疑的です。移行にスペルミスがあり、修正しない限り実際には機能しません。これは、修正されずに少なくとも 7 か月間壊れています。gem のダウンロード数は 800 未満で、それほど多くはありません (ユーザーが少ない = バグを見つけて修正する人が少ない)。


さて、私は実際に何が起こっているのかを理解しました。上記を書き上げるのに約 20 分かかりましたが、後で誰かが問題をグーグル検索するのに役立つかもしれないので、そのままにしておきます。実際に起こったことは、システムにcircleという名前の gem があり、おそらく同じディレクトリに circle という名前のファイルがあるということだと思います。ロード パスが適切に設定されていないためrequire 'circle'、作成したファイルではなく、gem が検索されます。簡単な答えは、require File.dirname(__FILE__) + '/circle'代わりに言うことですrequire 'circle'これは実際には正しい答えではありませんが、正しいことを理解するために必要な無数のニュアンスに立ち入らずに機能します。何が正しいかを知りたい場合は、使用している Ruby のバージョン、このコードをどのように使用して呼び出すか、ディレクトリ構造がどのようになっているかを知る必要があります。

また。circle.rb が同じディレクトリ内のファイルであると言っていたら、一番上の答えで 20 分も無駄にはしなかったでしょう。問題を理解するために、今後十分なコンテキストを提供する必要があります。

于 2013-03-31T15:39:15.227 に答える
10

このページはエラー メッセージをグーグルで調べたときに最初に表示されるため、代わりにrspecを実行しようとするとこのエラー メッセージが表示されることに注意してください。app/models/...spec/models/...

于 2014-05-02T14:39:58.700 に答える
2

必要がある

gem install activerecord

お役に立てれば。

于 2013-03-31T15:37:25.530 に答える