Rails - возможность «запомнить меня»

У меня проблемы с пониманием реализации «Помни меня» в Руководстве Майкла Хартла по Ruby on Rails. Он создает модуль SessionsHelper с методами для входа в систему, содержащий следующее:

module SessionsHelper

    def sign_in(user)
        cookies.permanent.signed[:remember_token] = [user.id, user.salt]
        current_user = user
    end

    def current_user=(user)
        @current_user = user
    end

    def current_user
        return @current_user ||= user_from_remember_token
    end

    private
        def user_from_remember_token
            #passes array of length two as a parameter -- first slot contains ID,
            #second contains SALT for encryption
            User.authenticate_with_salt(*remember_token)
        end

        def remember_token
            #ensures return of a double array in the event that
            #cookies.signed[:remember_token] is nil.
            cookies.signed[:remember_token] || [nil,nil]
        end

end

ПРИМЕЧАНИЕ. Метод Authenticate_with_salt в модели User находит пользователя по первому параметру (id), и если пользователь определен и его соль эквивалентна второму параметру (соль), тогда возвращается пользователь, в противном случае возвращается nil.

Мне сложно понять, почему мы так стараемся проверить, был ли пользователь уже вошел в систему:

В том случае, если пользователь вошел в систему, @current_user уже определен методом sign_in , и поэтому || = в методе current_user является бессмысленно.

Если пользователь не вошел в систему, оператор || = в методе current_user возвращает значение, возвращаемое методом user_from_remember_token , но начиная с файлов cookie. подписанный [: Remember_token] будет равен нулю, User.authenticate_with_salt [1114708 4] будет передан аргумент [nil, nil] и будет возвращен nil, и, следовательно, метод current_user вернет nil.

Короче говоря,если метод current_user возвращает @current_user, если он определен, и nil в противном случае, не было бы намного проще просто использовать обычный метод доступа:

def current_user
    return @current_user
end

В книге Майкла Хартла говорится, что это было бы бесполезно потому что статус входа пользователя будет забыт. Почему так ??? Может кто-нибудь объяснить, почему мы не делаем этого и вместо этого используем гораздо более сложную версию, опубликованную выше?

5
задан Kvass 22 June 2011 в 14:01
поделиться