2011-05-13 132 views
2

我在Ruby on Rails应用程序安装色器件宝石进行身份验证,我跑了数据库迁移这样的:错误运行Ruby on Rails的数据库迁移

rake db:migrate 

,并得到这个错误:

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

这有点神秘。我应该在哪里进行调试,问题是什么?

我做的唯一非标准件事是给它的表名“用户”,这是在此之前的命令我的表名:轨生成设计用户

而且,我的routes.rb文件有这个新条目:

devise_for :users 

可能是问题是我的数据库中的不匹配的列以及认证包认为用户表应该是什么样的问题。我在哪里看看auth软件包认为这些列是什么样的?我在哪里可以找到create-table命令用于我拥有的用户表的位置。它最初是用脚手架命令制作的,它在我的系统中放置了大量额外和无用的东西。

我的DB /迁移/用户/ 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 

这是基本的,但我的用户在db表中有这些列:

+------------------+------------------+------+-----+---------+-------+ 
| 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命令后如何存在这种不一致性。如果不是我发布的上述文件,它从哪里接受指示?

谢谢!

+0

您可以粘贴未迁移的迁移文件(或文件)的内容吗? – twmills 2011-05-13 18:18:05

+0

@twmills实际上,这是问题的一部分 - 我不完全确定如何得到这些文件大声笑......他们通常会在哪里找到? – GeekedOut 2011-05-13 18:22:30

+0

您之前是否运行过迁移? – eveevans 2011-05-13 18:42:26

回答

1

我建议你运行分贝:迁移与--trace选项命令:

rake db:migrate --trace 

举个例子,我特意在我的色器件移民增添了语法错误,这是我输出的片段得到。正如你所看到的那样,--trace选项应该指向你确切的错误(迁移文件+行号)。

undefined method `strin' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x00000106c5ea98> 
    /Users/#####/.rvm/gems/[email protected]/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/[email protected]/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:157:in `create_table' 
... 

注意迁移文件所在的目录db/migrate下。因此,鉴于上面的错误,我需要去开拓DB /迁移/ 20101031153010_devise_create_users.rb迁移文件,并修复错误第13行

+0

@feelnoway我真的不明白为什么我的db/migrate目录中只有4个文件,而我的MySQL数据库中只有20个表。我曾经使用scaffold命令,但真正想知道可能会把那些额外的表放在那里。有关为什么可能发生的任何想法? – GeekedOut 2011-05-13 18:29:33

+0

@feelnoway我编辑了我的问题,以显示迁移脚本和创建的数据库表。 – GeekedOut 2011-05-13 18:34:09

+0

不知道你的环境的历史,很难说这些表是什么,它们来自哪里。你有没有考虑清理你的数据库,然后再次运行你的迁移?您可能想尝试'rake db:migrate:reset'命令,但请记住这会消除当前存储在数据库中的数据,因此您可以先确认数据。如果这不起作用,我会考虑手动删除数据库中的所有表或者重新创建一个数据库。 – mbreining 2011-05-13 18:36:13

10

我产生一种新的模式后也有类似的错误:

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

问题是我在生成模型时使用'reference'而不是'references'。此命令创建以下迁移:

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

并且方法'reference'未定义,因此错误。在我的情况,迁移应该是:

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

检查迁移文件“迁移/ 20101031153010_devise_create_users.rb”。 您可能在代码中犯了错误或错字。

0

我的问题是,我用:

za$ rails g scaffold team name:string team_id:integer:uniq references:vendor 

相反的:

za$ rails g scaffold team name:string team_id:integer:uniq vendor:references 

只是改变vendor:references to vendor:references

愚蠢的错误,我知道了。