我在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
问题可能是我的数据库中的列不匹配,以及auth包认为用户表应该是什么样的。我在哪里看看auth包认为列是什么样的?我在哪里可以找到create-table命令对于我所拥有的users表的位置。它最初是用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
哪个是基本的,但我的db中的users表有以下列:
+------------------+------------------+------+-----+---------+-------+
| 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 :(得分: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
答案 1 :(得分: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行的错误。
答案 2 :(得分:0)
检查您的迁移文件“migrate / 20101031153010_devise_create_users.rb”。 您可能在代码中犯了错误或拼写错误。
答案 3 :(得分: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
愚蠢的错误,我知道。