This chapter describes how to add storage tokens to ensure that the user's login status is saved and that the session is cleared only if the user explicitly displays a message. I understand the importance of having this feature in my application, so I want to make sure that it works correctly. I get a bunch of errors though when I run
$ bundle exec rspec spec/
and I suspect they are related to my user model, as they all contain:
NoMethodError: undefined method `remember_token=' for #<User:...>
and the last one contains
Failure/Error: it { should respond_to(:remember_token) }
and then specify my files user_spec.rb, user.rb and authentication_pages_spec.rb, which I have included most of (the relevant 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+\-.] +@ [az\d\-.]+\.[az]+\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 start user_spec.rb:
Any help would be greatly appreciated!