问题
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: "user@example.com",
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!
回答1:
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
回答2:
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.
回答3:
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.
回答4:
I met the same issue while learning Mhartl tutorial.I solved it. this problem shows up coz when you database already have some user data, then "remember_token" migrate won't work. you must clean your date firt,then do db:migrate.like this:
rake db:drop db:create rake db:migrate (be carefull:this will erase all your data)
hope help
回答5:
I just had the same problem, getting undefined method find_by_remember_token.
Here's what I did to fix it:
heroku run rake db:migrate
Then push to heroku again
git push heroku
来源:https://stackoverflow.com/questions/10374416/chapter-8-rails-tutorial-remember-token-errors