Я не очень хорошо разбираюсь в Rails, но вот мое непрофессиональное понимание методов в SessionsHelper
.
Во-первых, @current_user
является переменной экземпляра модуля SessionsHelper
. Это означает, что он сохраняется для последующих вызовов методов в SessionsHelper
.
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
То есть, используя "self" вместо "current_user", current_user становится частью сеанса, но еще не сохраняется в базе данных, верно?
self.current_user = user
не делает 'current_user' частью чего-либо.
self
ссылается на себя, SessionsHelper.
self.current_user =
фактически вызывает свой собственный метод, метод установки, def current_user=(user)
.
Если это так, то методы, перечисленные в листинге 8.22, являются методами получения и установки, правильно?
да.
def current_user=(user) # Setter.
@current_user = user
end
Первый, кто сохранил current_user в БД,
Нет. Первый метод, current_user=
, не ничего не сохраняет в базе данных. Все, что он делает, это устанавливает переменную экземпляра @current_user
в user
.
def current_user # Getter.
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
и второй, чтобы получить его по мере необходимости?
Второй метод, current_user
, возвращает существующее значение @current_user
.
Если @current_user
равно nil
(null), выполняется
||= User.find_by_remember_token(cookies[:remember_token])
который извлекает и устанавливает @current_user
в качестве User
из базы данных на основе файла cookie браузера remember_token.
И, наконец, методы getter и setter необходимы, потому что не рекомендуется предоставлять переменную экземпляра в методе (в данном случае "sign_in")?
На мой взгляд, методы геттера и сеттера точно не нужны. Можно просто использовать @current_user
во всем помощнике.
Однако Devise ( популярный гем аутентификации пользователей) использует метод current_user
в своих помощниках. Этот комментарий актуален также.
Другими словами, было бы неправильно заменить: self.current_user = user
на @current_user = user
в методе "sign_in"?
Не должно быть ничего плохого в том, чтобы заменить его на @current_user = user
. Этот вопрос (та же ссылка, что и связанный комментарий выше) показывает, что функциональность идентична в случае учебника.
person
Sun
schedule
09.05.2013