2

Ruby on Rails アプリケーションに認証用の devise gem をインストールしており、次のようにデータベースの移行を実行しました。

rake db:migrate

このエラーが発生しました:

undefined method `reference' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x9322248>

これは少し不可解です。これをデバッグするにはどこに行けばよいですか?また、何が問題なのですか?

私が行った唯一の非標準的なことは、この前のコマンドでのテーブル名である「users」というテーブル名を付けたことです: rails generate devise users

また、routes.rb ファイルには次の新しいエントリがあります。

devise_for :users

おそらく問題は、データベース内の列が一致していないことと、認証パッケージがユーザーテーブルをどのようにすべきかを考えていることです。認証パッケージが列をどのように考えているかを確認するには、どこを見ればよいですか? そして、私が持っているユーザーテーブルの create-table コマンドがどこにあるかはどこにありますか? これはもともと scaffold コマンドで作成されたもので、システムに余計なものや役に立たないものをたくさん入れていました。

私の db/migrate/users/create_users ファイルは次のようになります。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

これは基本的なことですが、データベース内のユーザー テーブルには次の列があります。

+------------------+------------------+------+-----+---------+-------+
| Field            | Type             | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| uid              | int(10) unsigned | NO   | PRI | 0       |       |
| name             | varchar(60)      | NO   | UNI |         |       |
| pass             | varchar(128)     | NO   |     |         |       |
| mail             | varchar(254)     | YES  | MUL |         |       |
| theme            | varchar(255)     | NO   |     |         |       |
| signature        | varchar(255)     | NO   |     |         |       |
| signature_format | varchar(255)     | YES  |     | NULL    |       |
| created          | int(11)          | NO   | MUL | 0       |       |
| access           | int(11)          | NO   | MUL | 0       |       |
| login            | int(11)          | NO   |     | 0       |       |
| status           | tinyint(4)       | NO   |     | 0       |       |
| timezone         | varchar(32)      | YES  |     | NULL    |       |
| language         | varchar(12)      | NO   |     |         |       |
| picture          | int(11)          | NO   |     | 0       |       |
| init             | varchar(254)     | YES  |     |         |       |
| data             | longblob         | YES  |     | NULL    |       |
+------------------+------------------+------+-----+---------+-------+

また、migrate コマンドを実行した後、このような不整合がどのように発生するのかわかりません。私が投稿した上記のファイルではない場合、どこから指示を受けますか?

ありがとう!

4

4 に答える 4

10

新しいモデルを生成した後、同様のエラーが発生しました。

rails generate model Status open:boolean available:integer station:reference

問題は、モデルを生成するときに「参照」ではなく「参照」を使用していたことです。このコマンドは、次の移行を作成します。

class CreateStatuses < ActiveRecord::Migration
    def change
        create_table :statuses do |t|
            t.boolean :open
            t.integer :available
            t.reference :station
        end
    end
end

メソッド「参照」は定義されていないため、エラーが発生します。私の場合の移行は次のようになります。

class CreateStatuses < ActiveRecord::Migration
    def change
        create_table :statuses do |t|
            t.boolean :open
            t.integer :available
            t.references :station
        end
    end
end
于 2011-11-20T11:19:40.110 に答える
1

--traceオプションを指定してdb:migrateコマンドを実行することをお勧めします。

rake db:migrate --trace

例として、デバイスの移行に意図的に構文エラーを追加しました。これは、取得した出力のフラグメントです。ご覧のとおり、-traceオプションは、正確なエラー(移行ファイル+行番号)を示しているはずです。

    undefined method `strin' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x00000106c5ea98>
    /Users/#####/.rvm/gems/ruby-1.9.2-p136@rails3/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/schema_definitions.rb:326:in `method_missing'
    /Users/#####/rails/$$$$$$/db/migrate/20101031153010_devise_create_users.rb:13:in `block in up'
    /Users/#####/.rvm/gems/ruby-1.9.2-p136@rails3/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:157:in `create_table'
...

移行ファイルはdb/migrateディレクトリの下にあることに注意してください。したがって、上記のエラーが発生した場合、db / migrate / 20101031153010_devise_create_users.rb移行ファイルを開き、13行目のエラーを修正する必要があります。

于 2011-05-13T18:19:08.867 に答える