NoMethodError未定义的方法`保存”的零:NilClass

问题描述:

什么我需要做的,解决这一问题?我对轨道上的红宝石很陌生。NoMethodError未定义的方法`保存”的零:NilClass

当rspec的是跑了错误

1) remember token should have a nonblank remember token 
Failure/Error: before { @user.save } 
NoMethodError: 
    undefined method `save' for nil:NilClass 
# ./spec/models/user_spec.rb:125:in `block (2 levels) in <top (required)>' 

user_spec.rb

require 'spec_helper' 
describe User do 

before do 
@user = User.new(name: "Example User", email: "[email protected]", 
password: "foobar", password_confirmation: "foobar") 
end 
. 
. 
. 
it { should respond_to(:remember_token) } 
. 
. 
. 
describe "with a password that's too short" do 
    before { @user.password = @user.password_confirmation = "a" * 5 } 
    it { should be_invalid } 
    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 
describe "remember token" do 
    before { @user.save } 
    it "should have a nonblank remember token" do 
    subject.remember_token.should_not be_blank 

    end 
end 

user.rb

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+\-.][email protected][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 

它看起来像下面的代码块

describe "remember token" do 

是外块

describe User do 
    ... 
end 

如果你移动它的块中,那么它就会有行动前的大火,创建@user对象(你再自己保存块之前)

在@user变量将不存在,所以

你应该将形容“记得令牌”内 - >

describe User do 

    //current definitions 

    describe "remember token" do 
    before { @user.save } 
    it "should have a nonblank remember token" do 
     subject.remember_token.should_not be_blank 
    end 
    end 
end