我正在Ruby on Rails应用程序中安装用于身份验证的设计gem,并且我像这样运行数据库迁移:
rake db:migrate
并得到此错误:
undefined method `reference' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x9322248>
这有点晦涩难懂。 我应该去哪里调试它,问题可能是什么?
我所做的唯一非标准的事情是给它表名"users",这是我在上一个命令中的表名:rails 生成设计用户
另外,我的routes.rb文件有这个新条目:
devise_for :users
问题可能是我的数据库中的列不匹配以及身份验证包认为用户表应该是什么样的。 我在哪里查看身份验证包认为列是什么样的? 以及我在哪里可以找到我拥有的用户表的创建表命令的位置。 它最初是用脚手架命令制作的,它在我的系统中放了一大堆额外和无用的东西。
我的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 | |
+------------------+------------------+------+-----+---------+-------+
而且我不确定在运行迁移命令后如何存在这种不一致。 如果不是我发布的上述文件,它从哪里获取说明?
谢谢!
生成新模型后我遇到了类似的错误:
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
我建议你使用 --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行的错误。
检查迁移文件"migrate/20101031153010_devise_create_users.rb"。您可能在代码中犯了错误或拼写错误。
我的问题是我使用了:
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
愚蠢的错误,我知道。