简体   繁体   English

迁移时,rails会产生devise用户错误

[英]rails generate devise User error when migrating

I'm a bit new in Rails world and I try to add a new field in devise schema. 我在Rails世界中有点陌生,我尝试在devise模式中添加一个新字段。

I found this : 我找到了这个 :

rails generate model NAME [field[:type][:index] field[:type]

and tried to apply the command : 并尝试应用命令:

rails generate devise User linkedin:string

The process seemed correct : 该过程似乎是正确的:

invoke  active_record
  create    db/migrate/20130902085306_add_devise_to_users.rb
  insert    app/models/user.rb
   route  devise_for :users

But when I launch a db:migrate it occures an error : 但是,当我启动db:migrate时,会发生错误:

PG::Error: ERROR:  column "email" of relation "users" already exists

What did I do wrong ? 我做错了什么 ? why does it say (and is it related) email is wrong while it was ok before ? 为什么以前没问题,但它说(和有关)电子邮件是错误的?

Thanks a lot ! 非常感谢 !


Here is the migration file result : 这是迁移文件的结果:

class AddDeviseToUsers < ActiveRecord::Migration
def self.up
change_table(:users) do |t|
  ## Database authenticatable
  t.string :email,              :null => false, :default => ""
  t.string :encrypted_password, :null => false, :default => ""

  ## Recoverable
  t.string   :reset_password_token
  t.datetime :reset_password_sent_at

  ## Rememberable
  t.datetime :remember_created_at

  ## Trackable
  t.integer  :sign_in_count, :default => 0
  t.datetime :current_sign_in_at
  t.datetime :last_sign_in_at
  t.string   :current_sign_in_ip
  t.string   :last_sign_in_ip

  ## Confirmable
  # t.string   :confirmation_token
  # t.datetime :confirmed_at
  # t.datetime :confirmation_sent_at
  # t.string   :unconfirmed_email # Only if using reconfirmable

  ## Lockable
  # t.integer  :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
  # t.string   :unlock_token # Only if unlock strategy is :email or :both
  # t.datetime :locked_at

  ## Token authenticatable
  # t.string :authentication_token

  t.string :linkedin

  # Uncomment below if timestamps were not included in your original model.
  # t.timestamps
end

add_index :users, :email,                :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token,   :unique => true
# add_index :users, :unlock_token,         :unique => true
# add_index :users, :authentication_token, :unique => true
end

def self.down
# By default, we don't want to make any assumption about how to roll back a migration when your
# model already existed. Please edit below which fields you would like to remove in this migration.
raise ActiveRecord::IrreversibleMigration
end
end

Does your users table already have email field? 您的用户表是否已经有电子邮件字段? It seems there is, you have to remove creating an email field again by removing it from migration and make sure it is not referenced twice in user.rb model 似乎有,您必须通过从迁移中删除它来再次删除创建电子邮件字段,并确保在user.rb模型中没有两次对其进行引用

db/migrate/20130902085306_add_devise_to_users.rb

Ok! 好! I've found what was wrong : I created a new table instead of updating existing one. 我发现了问题所在:我创建了一个新表,而不是更新现有表。 So the good task was : 因此,好的任务是:

rails g migration add_columnLinkedin_to_users

Then adding in the new created migration file : 然后添加新创建的迁移文件:

change_table :users do |t|
  t.string   :linkedin
end

And db:migrate was a success ! db:migrate成功了!

Thanks for your helps ! 感谢您的帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM