NoMethodError in Devise::SessionsController#create undefined method `current_sign_in_at'
devise, nomethoderror, ruby-on-rails
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
Problem
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.