Question

I am getting the following error when I try to sign in in my rails app. I used devise for authentication. My error is NoMethodError in Devise::SessionsController#create undefined method `current_sign_in_at'

My user model is

models/user.rb
 devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable
attr_accessible :admin,:first_name, :last_name, :profile_name, :college_name, :email, :password, :password_confirmation, :remember_me, :provider, :uid
def admin?

end
def self.find_for_facebook_oauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.provider = auth.provider
user.uid = auth.uid
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
#user.name = auth.info.name   # assuming the user model has a name
#user.image = auth.info.image # assuming the user model has an image
user.save!
end
end
end

My schema is

db/schema.rb
ActiveRecord::Schema.define(:version => 20140126101946) do

create_table "levels", :force => true do |t|
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end

create_table "users", :force => true do |t|
t.string   "first_name"
t.string   "last_name"
t.string   "profile_name"
t.string   "college_name"
t.string   "email",                  :default => "",    :null => false
t.string   "encrypted_password",     :default => "",    :null => false
t.string   "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.datetime "created_at",                                :null => false
t.datetime "updated_at",                                :null => false
t.string   "provider"
t.string   "uid"
t.boolean  "admin",                  :default => false
end

add_index "users", ["email"], :name => "index_users_on_email", :unique => true
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true

end

The code in my devise_create_users.rb is

class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
  t.string :first_name
  t.string :last_name
  t.string :profile_name
  t.string :college_name
  ## 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

My trackable was commented and I removed the comments and then ran rake db:migrate but nothing happened. Now I cannot remove trackable as I need it. What I need is that somehow I can keep my devise as it is and also add trackable to it in such a way that it gets added to the schema.rb as well.

Was it helpful?

Solution

To add new columns to existing tables, simply updating already run migration is not going to work as the schema is at a later version than your existing migration's version. If you wish to modify the existing migration, you could run a down migration with:

rake db:migrate:down VERSION=20140126101944 # use version of the user migration

Then modify the migration adding the new columns as you've already done, then run up migration using:

rake db:migrate:up VERSION=20140126101944 # use version of the user migration

A better approach is to add a new migration with the change if your application is already in production.

To add the trackable columns to existing users table:

class AddTrackableColumnsToUser < ActiveRecord::Migration
  def change
    change_table :users do |t|
      ## Trackable
      t.add_column :sign_in_count, :integer, :default => 0
      t.add_column :current_sign_in_at, :datetime
      t.add_column :last_sign_in_at, :datetime
      t.add_column :current_sign_in_ip, :string
      t.add_column :last_sign_in_ip, :string
    end
  end
end

Then run db:migrate:

rake db:migrate

OTHER TIPS

In your models/user.rb

Change

devise :database_authenticatable, :registerable, :recoverable, :rememberable, 
       :trackable, :validatable, :omniauthable

to

devise :database_authenticatable, :registerable, :recoverable, :rememberable,
       :validatable, :omniauthable

i.e. remove :trackable

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top