2013-07-22 2 views
0

Весь мой тест rspec test, но я не могу выйти из примера приложения. Когда я нажимаю «Выйти» на вкладке «Учетная запись» в заголовке, ссылка не изменяется на «Вход в систему», но остается такой, как если пользователь все еще выполнил вход в систему.Michael Hartl: Глава 8 - не удалось выйти из примера приложения

Я также попытался реализовать решение из этого (очень) аналогичный post. Однако даже после добавления маркера памяти в консоли rails проблема сохраняется.

Вот sessions_controller.rb

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_back_or user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

Вот sessions_helper.rb

module SessionsHelper 

    def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

    def signed_in? 
    !self.current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

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

    def current_user?(user) 
    user == current_user 
    end 

    def signed_in_user 
    unless signed_in? 
     store_location 
     redirect_to signin_url, notice: "Please sign in." 
    end 
    end 

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

    def redirect_back_or(default) 
    redirect_to(session[:return_to] || default) 
    session.delete(:return_to) 
    end 

    def store_location 
    session[:return_to] = request.url 
    end 
end 

Вот это _header.html.erb

<header class="navbar navbar-fixed-top navbar-inverse"> 
    <div class="navbar-inner"> 
    <div class="container"> 
     <%= link_to "sample app", root_path, id: "logo" %> 
     <nav> 
     <ul class="nav pull-right"> 
      <li><%= link_to "Home", root_path %></li> 
      <li><%= link_to "Help", help_path %></li> 
      <% if signed_in? %> 
      <li><%= link_to "Users", users_path %></li> 
      <li id="fat-menu" class="dropdown"> 
       <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 
       Account <b class="caret"></b> 
       </a> 
       <ul class="dropdown-menu"> 
       <li><%= link_to "Profile", current_user %></li> 
       <li><%= link_to "Settings", edit_user_path(current_user) %></li> 
       <li class="divider"></li> 
       <li> 
        <%= link_to "Sign out", signout_path, method: "delete" %> 
       </li> 
       </ul> 
      </li> 
      <% else %> 
      <li><%= link_to "Sign in", signin_path %></li> 
      <% end %> 
     </ul> 
     </nav> 
    </div> 
    </div> 
</header> 

А вот пользователь модель .rb

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

    before_save {self.email = email.downcase} 
    before_create :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, presence: true, length: {minimum: 6} 
    validates :password_confirmation, presence: true 
    after_validation { self.errors.messages.delete(:password_digest) } 

    def User.new_remember_token 
    SecureRandom.urlsafe_base64 
    end 

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

    private 

    def create_remember_token 
     self.remember_token = User.encrypt(User.new_remember_token) 
    end 
end 
+0

Возможно, файл cookie не удаляется? Все остальное выглядит хорошо. Попробуйте 'puts'-ing значение cookie после того, как вы попробуете удалить его, чтобы увидеть, если его nil и что последующий вызов current_user возвращает nil – DiegoSalazar

ответ

0

У меня также были проблемы с этим. попробуйте это:

def sign_out 
    #https://stackoverflow.com/questions/7948756/why-are-my-rspec-tests-failing-but-my-app-is-working?lq=1 
    self.current_user = nil 
    @current_user = nil 
    cookies.delete(:remember_token) 
end 

так проверить эту link (это один закомментирована в моем коде) и посмотреть, если это помогает. Удачи!

Смежные вопросы