У меня проблемы с пониманием реализации «Помни меня» в Руководстве Майкла Хартла по 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
В книге Майкла Хартла говорится, что это было бы бесполезно потому что статус входа пользователя будет забыт. Почему так ??? Может кто-нибудь объяснить, почему мы не делаем этого и вместо этого используем гораздо более сложную версию, опубликованную выше?