我是Ruby on Rails的新手,我正在按照https://www.railstutorial.org/book/指南了解更多信息。我坚持6.3.3,它告诉我创建一个安全的密码。之前的迁移似乎有效(创建唯一索引并创建安全密码列)。之后,当我尝试运行时:
rake test
它表示测试已中止,我应该运行:
rake db:migrate RAILS_ENV=test
但是当我运行上面的命令时,它会返回:
c:\Sites\sample_app>rake db:migrate RAILS_ENV=test
DL is deprecated, please use Fiddle
== 20141226095217 AddIndexToUsersEmail: migrating =============================
-- add_index(:users, :email, {:unique=>true}) rake aborted! StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::ConstraintException: indexed columns are not unique: CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")c:/Si tes/sample_app/db/migrate/20141226095217_add_index_to_users_email.rb:3:in `change' C:in `migrate' Tasks: TOP => db:migrate (See full trace by running task with --trace)
我不明白为什么会这样。我的数据库是空的。
根据要求,迁移文件:
20141226095217_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration
def change
add_index :users, :email, unique: true
end
end
20141226095746_add_password_digest_to_users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration
def change
add_column :users, :password_digest, :string
end
end
答案 0 :(得分:1)
有关完全相同的问题,请参阅https://stackoverflow.com/a/14765346/429758。如前所述,问题不在于迁移,而是在users表中具有email
字段的重复值。
由于在运行测试时发生此错误,这意味着测试数据库为用户提供了重复的电子邮件。
Rails教程书使用夹具设置测试数据。用于在测试环境中创建用户的test/fixtures/users.yml
文件显示在Listing 6.29中,如下所示:
one:
name: MyString
email: MyString
two:
name: MyString
email: MyString
这两个以MyString
为电子邮件的灯具都是导致迁移失败的原因。更改值以确保两者具有不同的值。
示例:
one:
name: First User
email: first@example.com
two:
name: Second User
email: second@example.com
回顾Rails教程,Listing 6.30中的下一步是清空test/fixtures/users.yml
文件。这是确保不会发生此错误的另一种方法。