Jakxna360
Jakxna360

Reputation: 885

Rails tutorial 6.3.4 authenticate error

I'm doing the ruby on rails tutorial book and I have come to an error. I checked everything he wrote and I still get the error. It tells me authenticate is an undefined method for nil:NILclass. I don't know what to do.

user.rb:

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

before_save { |user| user.email = email.downcase }
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, presence: true, length:{ minimum: 6 }
validates :password_confirmation, presence: true
end

and (some of) my user_spec.rb

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

    subject { @user }

it { should respond_to(:password_digest) }
it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }
it { should respond_to(:authenticate) }

it { should be_valid }

       #    USER.PASSWORD

describe "when password is not present" do
  before { @user.password = @user.password_confirmation = " "}
  it {should_not be_valid}
end

describe "when password is not present" do
  before { @user.password_confirmation = "mismatch" }
  it { should_not be_valid }

describe "when password is nil" do
  before { @user.password_confirmation = nil }
  it {should_not be_valid}
end  

describe "with a password that's too short" do
  before { @user.password = @user.password_confirmation = "a" * 5 }
  it { should be_valid }
end

describe "return value of authenticate method" do
  before { @user.save }
  let(:found_user) { User.find_by_email(@user.email) }

  describe "with valid password" do
    it { should == found_user.authenticate(@user.password) }
    end

  describe "with invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate("invalid") }

    it {should_not == user_for_invalid_password}
    specify { user_for_invalid_password.should be_false}
  end
end
end

Thanks alot for all that can help.

Upvotes: 0

Views: 652

Answers (1)

Phonbopit
Phonbopit

Reputation: 3383

I am new in ruby on rails.I just pass this tutorials. when I doing I found errors same you.

I hope my solved can help you.

in your user.rb
remove line: attr_accessor and edit has_secure password to has_secure_password (add underscore)

class User < ActiveRecord::Base 
attr_accessible :email, :name, :password, :password_confirmation
has_secure_password
enter code here
  before_save { |user| user.email = email.downcase }
  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, presence: true, length:{ minimum: 6 }
  validates :password_confirmation, presence: true
end

in your user.spec.rb

1) you missed 'end' tag in describe "when password is not present"

2) Change test describe 'with a password that's too short' from it { should be_valid} to it { should be_invalid } I think it should be invalid if password less than 5.

3) finally if you want to test pass authenticate you should change your email end with .com or any that matches with VALID_EMAIL_REGEX in user.rb like:

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

I wish this help you.

sorry for my bad english.

Upvotes: 1

Related Questions