Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Chapter 8 Rails Tutorial Remember Token Errors

This chapter is on adding remember tokens to ensure that the user signin status is remembered and that the session is only cleared when the user explicitly signs out. I understand the importance of having this feature in my app, so want to make sure that it works correctly. I'm getting a bunch of errors though, when I run

$ bundle exec rspec spec/

and I suspect they have to do with my user model, as they all but one contain:

NoMethodError:
       undefined method `remember_token=' for #<User:...>

and the last contains

Failure/Error: it { should respond_to(:remember_token) }

and then point to my user_spec.rb, user.rb, and and authentication_pages_spec.rb files, which I have included most of (the pertinent parts) here.

user.rb:

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime        not null
#  updated_at :datetime        not null
#

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }
  validates :password_confirmation, presence: true

  private

      def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
      end
end

authentication_pages_spec.rb:

require 'spec_helper'

describe "Authentication" do

  subject {page}
  describe "signin page" do
    before { visit signin_path }
    it {should have_selector('h1', text: 'Sign in')}
    it {should have_selector('title', text: 'Sign in')}
  end

  describe "signin" do
    before {visit signin_path}

    describe "with invalid information" do
      before {click_button "Sign in"}

      it {should have_selector('title', text: 'Sign in')}
      it {should have_selector('div.alert.alert-error', text: 'Invalid')}

      describe "after visiting another page" do
              before { click_link "Home" }
              it { should_not have_selector('div.alert.alert-error') }
            end
    end

    describe "with valid information" do
          let(:user) { FactoryGirl.create(:user) }
          before do
            fill_in "Email",    with: user.email
            fill_in "Password", with: user.password
            click_button "Sign in"
          end

          it { should have_selector('title', text: user.name) }
          it { should have_link('Profile', href: user_path(user)) }
          it { should have_link('Sign out', href: signout_path) }
          it { should_not have_link('Sign in', href: signin_path) }
          end
  end
end

and the beginning of user_spec.rb:

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime        not null
#  updated_at :datetime        not null
#

require 'spec_helper'

describe User do

  before do
      @user = User.new(name: "Example User", email: "[email protected]", 
                       password: "foobar", password_confirmation: "foobar")
  end

  subject { @user }

  it { should respond_to(:name) }
  it { should respond_to(:email) }
  it { should be_valid }
  it { should respond_to(:password_digest) }
  it { should respond_to(:password) }
  it { should respond_to(:password_confirmation) }
  it { should respond_to(:authenticate) }
  it { should respond_to(:remember_token) }

  describe "remember token" do
      before { @user.save }
      its(:remember_token) { should_not be_blank }
    end
.
.
.

Any help would be much appreciated!

like image 867
skirmishdirmish Avatar asked Apr 29 '12 17:04

skirmishdirmish


3 Answers

If you get this error in production on Heroku, after you run:

heroku run rake db:migrate

you need to restart your app:

heroku restart
like image 97
cjaypierson Avatar answered Nov 07 '22 11:11

cjaypierson


Did you generate the migration for adding the column to the User model ?

$ rails generate migration add_remember_token_to_users

After this edit the migration file to add the new field remember_token

and

After that you need to do

$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare

Your annotations on the model don't show the column. Make sure you executed the above commands.

like image 35
rangalo Avatar answered Nov 07 '22 10:11

rangalo


I got similar test fail error. what I did is to generate the remember_token column with a string type.

rails generate migration add_remember_token_to_users remember_token:string --force

rake db:migrate RAILS_ENV=test

after that, test pass.

like image 2
Bryan Liu Avatar answered Nov 07 '22 10:11

Bryan Liu