Ruby-on-rails – Devise install from existing model/database

deviserubyruby-on-railsruby-on-rails-3ruby-on-rails-3.1

I am wondering how can i add devise to an existing database with a different user. Here I already have a customer model define and I want to change to allow devise to work on it.

I have created a new migration and inserted the code has follow

class AddDeviseToCustomer < ActiveRecord::Migration
  def change
    change_table :customers do |t|
      #t.database_authenticatable
      t.string :encrypted_password, :null => false, :default => '', :limit => 128
      t.confirmable
      t.recoverable
      t.rememberable
      t.trackable
      t.token_authenticatable
      t.timestamps
    end
  end
end

According to this it should work. https://github.com/plataformatec/devise/wiki/How-To:-change-an-already-existing-table-to-add-devise-required-columns. But when running rake db:migrate i get the following

undefined method `confirmable' for #<ActiveRecord::ConnectionAdapters::Table:0x9286a28>

I have run the following line

rails g devise:install

Any reason devise won't recognize it, do i need to do something to say customer is a devise??
Thanks in advance

Best Answer

It looks like that documentation is outdated.

Try using devise generator, it will create same migration, with correct parameters, it's ok if its an existing model:

rails g devise customer

it should create AddDeviseToCustomers migration

with something similar to this:

class AddDeviseToCustomers < ActiveRecord::Migration
def self.up
change_table(:customers) 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


  # Uncomment below if timestamps were not included in your original model.
  # t.timestamps
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

note that there is no more t.confirmable