2014-03-02 88 views
0

一旦我登录到我的应用程序中的下拉框中,当我点击注销它将我带到一个错误页面。而不是将我重定向到我的根页面。我在本章的最后。迈克尔哈特尔第8章不能退出

这是我得到的Rspec错误。

Failures: 

    1) Authentication signin page with valid information followed by signout 
    ←[31mFailure/Error:←[0m ←[31mbefore { click_link "Sign out" }←[0m 
    ←[31mNoMethodError←[0m: 
     ←[31mundefined method `update_attribute' for nil:NilClass←[0m 
←[36m  # ./app/helpers/sessions_helper.rb:29:in `sign_out'←[0m 
←[36m  # ./app/controllers/sessions_controller.rb:18:in `destroy'←[0m 
←[36m  # ./spec/requests/authentication_pages_spec.rb:36:in `block (5 levels) 
in <top (required)>'←[0m 

sessions_controllers

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_to user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

users_controllers

class UsersController < ApplicationController 

    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     sign_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:name, :email, :password, :password_confirmation) 
    end 
end 

sessions_helper

module SessionsHelper 

     def sign_in(user) 
     remember_token = User.new_remember_token 
     cookies.permanent[:remember_token] = remember_token 
     user.update_attribute(:remember_token, User.hash(remember_token)) 
     self.current_user = user 
     end 

     def signed_in? 
     current_user.nil? 
     end 

     def current_user=(user) 
     @current_user = user 
     end 

     def current_user 
     remember_token = User.encrypt(cookies[:remember_token]) 
     @current_user ||= User.find_by(remember_token: remember_token) 
     end 

     def sign_out 
     self.current_user = nil 
     cookies.delete(:remember_token) 
     end 

     def sign_out 
     current_user.update_attribute(:remember_token, 
             User.hash(User.new_remember_token)) 
     cookies.delete(:remember_token) 
     self.current_user = nil 
     end 
    end 

user_pages_spec

require 'spec_helper' 

describe "User pages" do 

    subject { page } 

    describe "profile page" do 
    let(:user) { FactoryGirl.create(:user) } 
    before { visit user_path(user) } 

    it { should have_content(user.name) } 
    it { should have_title(user.name) } 
    end 

    describe "signup page" do 
    before { visit signup_path } 

    let(:submit) { "Create my account" } 

    describe "with invalid information" do 
     it "should not create a user" do 
     expect { click_button submit }.not_to change(User, :count) 
     end 
    end 

    describe "with valid information" do 
     before do 
     fill_in "Name",   with: "Example User" 
     fill_in "Email",  with: "[email protected]" 
     fill_in "Password",  with: "foobar" 
     fill_in "Confirmation", with: "foobar" 
     end 

     describe "after saving the user" do 
     before { click_button submit } 
     let(:user) { User.find_by(email: '[email protected]') } 

     it { should have_link('Sign out') } 
     it { should have_title(user.name) } 
     it { should have_selector('div.alert.alert-success', text: 'Welcome') } 
     end 

     it "should create a user" do 
     expect { click_button submit }.to change(User, :count).by(1) 
     end 
    end 
    end 
end 

应用程序/模型/用户

class User < ActiveRecord::Base 
    before_save { self.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 } 
    has_secure_password 
    validates :password, length: { minimum: 6 } 

def User.new_remember_token 
    SecureRandom.urlsafe_base64 
    end 

    def User.hash(token) 
    Digest::SHA1.hexdigest(token.to_s) 
    end 

    private 

    def create_remember_token 
     self.remember_token = User.hash(User.new_remember_token) 
    end 
end 

authentication_pages_spec

require 'spec_helper' 

describe "Authentication" do 

    subject { page } 



    before { visit signin_path } 

    describe "signin page" do 
     before {visit signin_path} 
     it {should have_content("Sign in")} 
     it {should have_title("Sign in")} 

    describe "with invalid information" do 
     before { click_button "Sign in" } 
     it { should have_title('Sign in') } 
     it { should have_selector('div.alert.alert-error') } 

     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.upcase 
     fill_in "Password", with: user.password 
     click_button "Sign in" 
     end 

     describe "followed by signout" do 
     before { click_link "Sign out" } 
     it { should have_link('Sign in') } 
     end 

     it { should have_title(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 

回答

0

您已在会议助手定义了两个SIGN_OUT方法。

def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    end 

    def sign_out 
    current_user.update_attribute(:remember_token, 
            User.hash(User.new_remember_token)) 
    cookies.delete(:remember_token) 
    self.current_user = nil 
    end 

第二个是什么给你的错误,因为它试图update_attribute你在第一个方法中删除的当前用户。我认为如果你只是删除它,并使用更简单的第一个版本,测试应该通过。

+0

我的应用程序现在正在工作谢谢。我现在正在获取此rspec代码,我需要现在更新我的认证文件吗? '失败: 1)身份验证登录页面,其中包含有效信息,然后签名 ←[31m失败/错误:←[0m←[31mit {should have_link('登录')}←[0m ←[31mexpected #has_link?( “登录”)返回true,得到虚假←[0m ←[36m#./spec/requests/authentication_pages_spec.rb:37:in block(5 levels) in '←[0m 已完成0.90645秒 ←[31m49示例,1次失败,4次未决←[0m' – user3369825

+0

您可以发布与root_path关联的视图吗?它看起来像显示/隐藏sign_out_path和sign_in_path链接的逻辑取决于用户会话已损坏。 – chrisfin

+0

root_path是什么意思?这是我的第一个rails项目 – user3369825

相关问题