Tengo problemas para entender la implementación de "Recordarme" en el Tutorial de Ruby on Rails de Michael Hartl. Se crea un módulo SessionsHelper con métodos para iniciar sesión, que contiene lo siguiente:Rieles: capacidad para "recordarme"
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
NOTA: Elauthenticate_with_salt
método en el modelo de Usuario encuentra el usuario por el primer parámetro (el id) y si el usuario es definido y su sal es equivalente al segundo parámetro (la sal), luego se devuelve al usuario, de lo contrario, se devuelve nil.
Estoy teniendo problemas para entender por qué vamos a tales extremos para probar si el usuario ya ha sido firmado en:
En el caso de que el usuario ha iniciado sesión, @current_user
ya está definido por el método sign_in
y por lo tanto, el || = en el método current_user
no tiene sentido.
En el caso de que el usuario no ha iniciado sesión, el || = operador en el método current_user
devuelve el valor devuelto por el método user_from_remember_token
, pero desde cookies.signed [: remember_token] sería nulo, User.authenticate_with_salt
habría ser pasado el argumento [nil, nil] y devolvería nil, y por lo tanto, el método current_user
devolvería nil.
En resumen, si el método current_user
está volviendo @current_user si se define y nil de lo contrario, no sería mucho más sencillo de usar sólo el método de acceso convencional:
def current_user
return @current_user
end
libro de Michael Hartl dice que Hacer esto sería inútil porque el estado de inicio de sesión del usuario sería olvidado. ¿Por qué sería ese el caso? ¿Puede alguien explicar por qué no hacemos esto y en su lugar utilizar la versión mucho más compleja publicada anteriormente?
Pero una vez que @current_user está configurado por sign_in, ¿no está allí para quedarse? ¿Por qué no podemos simplemente usar una variable de instancia @current_user en lugar de una cookie? ¿Cuál es la principal diferencia entre ellos? – Kvass
Como la respuesta de Michael Venable dice: "la variable @current_user no persiste en todas las solicitudes de página". Así que, la primera vez que utiliza el método 'current_user' en una solicitud de página, debe obtener la información del usuario de la cookie. – vesan