Is it possible to add devise, if user model alread

2019-04-08 10:17发布

问题:

We already created a user model in the beggining of the project, but now (several migrations later) we would like to use the devise gem. Is it possible to add devise if the user model and table already exist? That is, is it possible to alter what is already done, or do we have to start all over again?

回答1:

Cavert Coder, but:

(Note, this doesn't migrate ":lockable" because I didn't care about it when I wrote it This now includes :lockable because MattSlay cared more than I did :). Also, you'll need to migrate your users passwords into the encrypted passwords field. Finally, it might not work for you. Sorry.)

class AddDevise < ActiveRecord::Migration
  def self.up
    null    = false
    default = ""

    add_column :users, :encrypted_password, :string, :null => null, :default => default, :limit => 128
    add_column :users, :password_salt, :string
    add_column :users, :authentication_token, :string
    add_column :users, :confirmation_token,   :string
    add_column :users, :confirmed_at,         :datetime
    add_column :users, :confirmation_sent_at, :datetime
    add_column :users, :reset_password_token, :string
    add_column :users, :remember_token,      :string
    add_column :users, :remember_created_at, :datetime
    add_column :users, :sign_in_count,      :integer, :default => 0
    add_column :users, :current_sign_in_at, :datetime
    add_column :users, :last_sign_in_at,    :datetime
    add_column :users, :current_sign_in_ip, :string
    add_column :users, :last_sign_in_ip,    :string

    #:lockable fields contributed by MattSlay
    add_column :users, :failed_attempts, :integer, :default => 0
    add_column :users, :unlock_token,   :string
    add_column :users, :locked_at, :datetime

  end

  def self.down
    remove_column :users, :encrypted_password
    remove_column :users, :password_salt
    remove_column :users, :authentication_token
    remove_column :users, :confirmation_token
    remove_column :users, :confirmed_at
    remove_column :users, :confirmation_sent_at
    remove_column :users, :reset_password_token
    remove_column :users, :remember_token
    remove_column :users, :remember_created_at
    remove_column :users, :sign_in_count
    remove_column :users, :current_sign_in_at
    remove_column :users, :last_sign_in_at
    remove_column :users, :current_sign_in_ip
    remove_column :users, :last_sign_in_ip
    remove_column :users, :failed_attempts
    remove_column :users, :unlock_token
    remove_column :users, :locked_at
  end
end


回答2:

In addition to the list that Aquarion provided, I think I've found the three fields you need if you wish to implement the :lockable option on the User model:

add_column :users, :failed_attempts, :integer, :default => 0
add_column :users, :unlock_token,   :string
add_column :users, :locked_at, :datetime


回答3:

I've done it. Its a bit of a pain but Devise is worth it. Make a dummy app and do the migrations. Then take a look at schema.rb and write some migrations that do the same thing to your existing user model.

Alternately you can read the through the source and find out where things like "database_authenticateable" are defined. You should start here.