2015-04-29 10 views
0

Я следую книге Майкла Хартла: «Ruby on Rails Tutorial 3». Я достиг раздел 8.4.1, где он говорит:Метод current_user возвращает nil

вновь зарегистрированных пользователей правильно запомнил, как вы можете проверить, входа в систему, закрыв браузер, и убедившись, что вы все еще вошли , когда вы перезапустите приложение-образец и перейдите к образцу .

Когда я выполняю эти шаги, я не зарегистрирован, то есть: я могу войти в систему, но когда я перезапущу браузер и перейду в приложение, я не войду в систему, поскольку он должен быть. (I ' м, используя локальный: 3000)

Если вы хотите, вы можете даже проверить куки браузера, чтобы увидеть результата непосредственно

этот, однако, работает. Я могу проверить, что файл cookie успешно сохранен.

Несколько раз я проходил эту главу, следя за тем же самым шагом, но все равно не повезло.

Также тест не красный, я могу выйти из системы в любое время. Я действительно не знаю, что делать. Я пробовал несколько вещей, но не повезло. Извините меня, если это простой вопрос, поскольку я новичок в рельсах.

Edit: вы можете просмотреть главу здесь: Rails tutorial 3

Edit 2:

Добавив еще несколько тестов, я могу найти, что проблема заключается в том, что current_user возвращается nil (примечание: проблема заключается в куки не сессий):

session_helper.rb

module SessionsHelper 

    # Logs in the given user. 
    def log_in(user) 
    session[:user_id] = user.id 
    end 

    # Remembers a user in a persistent session. 
    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    def forget user 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

# Returns the user corresponding to the remember token cookie. 
    def current_user 
    if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
    end 

# Returns true if the user is logged in, false otherwise. 
    def logged_in? 
    !current_user.nil? 
    end 

    # Logs out the current user. 
    def log_out 
    forget current_user 
    session.delete(:user_id) 
    @current_user = nil 
    end 
end 

модели/user.rb

class User < ActiveRecord::Base 
    attr_accessor :remember_token 
    before_save { self.email.downcase! } 
    validates :name, presence: true, length: {maximum: 50} 
    Valid_email_regex = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: {maximum: 255}, 
        format: {with: Valid_email_regex}, 
        uniqueness: { case_sensitive: false } 

    has_secure_password 
    validates :password, length: {minimum: 6} 

    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
               BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(:remember_token)) 
    end 

    def forget 
    update_attribute(:remember_digest, nil) 
    end 

    def authenticated?(remember_token) 
    return false if remember_digest.nil? 
    BCrypt::Password.new(remember_digest).is_password?(remember_token) 
    end 
end 

session_controller

# logging in a user by email and logging them out 
class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     log_in user 
     params[:session][:remember_me] == '1' ? remember(user) : forget(user) 
     redirect_to user 
    else 
     flash.now[:danger] = "Invalid email/password combination" 
     render 'new' 
    end 
    end 

    def destroy 
    log_out if logged_in? 
    redirect_to root_url 
    end 

end 

Любая помощь приветствуется.

ответ

0

1) с той лишь разницей, я могу видеть с моим собственным кодом, в моделях/user.rb в before_save я думаю, что вы либо {self.email.downcase} или {email.downcase! }

С этим я не смог воспроизвести вашу проблему.И я не вижу, как это может повлиять на сохранение журнала.

2) Код, который вы опубликовали, внедрил флажок «запомнить меня» от 8.5 Итак, когда вы зарегистрировались, вы отметили этот флажок?

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