On Jan 7, 2007, at 4:31 PM, Juan M. wrote:
sessiones
Es normal, es un concepto bastante mal definido y yo la verdad que
hasta que no estudie HTTP y CGI pelado no acabe de entenderlo, porque
los frameworks te lo ponen tan facil que no ves muy bien de que va
todo eso.
Si lees por ahi veras que se explica que trata de capturar la idea de
que “un tipo esta navegando por el website y recojo informacion de
esa navegacion”, pero eso no encaja muy bien porque la navegacion web
se da a ratos, el servidor no sabe cuando ha terminado, y en realidad
a la aplicacion normalmente le da lo mismo si el tio se fue de viaje
y entro en el website desde Egipto dos dias mas tarde. Para colmo se
suele ejemplificar con un carrito de la compra que en mi vida he
visto metido en una sesion.
Pero a la practica la idea es sencilla, a veces uno necesita pasar
informacion de una peticion a otra cuando esta viene del mismo
usuario (esto es inexacto pero ya nos vale). La “sesion” es un lugar
donde se almacena esa informacion, en forma de llaves/valores. Para
identificar que una peticion HTTP viene del mismo tipo que la que se
sirvio hace 300 requests atras se usa una cookie con un session_id,
que en el serivdor se vincula a ese hash que esta guardado con ese id
en algun lugar. Por defecto Rails los guarda en tmp/sessions, pero
tambien sabe guardarlos en base de datos y mas sitios. De todo eso no
has de preocuparte, se encarga Rails automaticamente.
Por ejemplo, en una navegacion que necesita autenticacion uno suele
poner algo en sesion que identifique al usuario. De otro modo entre
peticiones estariamos constantemente pidiendo login y contraseña para
hacer las cosas. Normalmente se pone un user_id en la sesion
en la accion de login
current_user = User.find_by_login_and_password(…)
if current_user
session[:user_id] = current_user.id
else
# pedir de nuevo credenciales
end
Como ves en Rails se asignan cosas a la sesion con una interfaz que
se parece a la de una tabla hash.
Cuando viene una peticion de nuevo Rails recupera la sesion asociada
al session_id que le llega por cookie, y la pone disponible a los
controladores. Uno asi puede preguntar si existe un user_id en esa
sesion
if session[:user_id]
current_user = User.find(session[:user_id])
end
La sesion en general no es necesario usarla para mucho mas, ya que
las cosas en web se suelen hacer persistentes en base de datos (e.g.
el susodicho carrito de la compra). En Rails otro uso comun es pasar
cadenas entre peticiones. Eso es lo que hace flash, mete en sesion la
cadena y Rails se encarga de que dure una sola request (dinamica).
Se entiende mas o menos?
– fxn
P.D.: Use lo del user_id como ejemplo sin muchos detalles, de hecho
uno suele delegar autenticacion a un plugin, y eso mismo lo hace el
plugin.