Revista Informática

Ruby on Rails desde Cero: Sesiones

Publicado el 30 enero 2014 por Codehero @codeheroblog

En este nuevo capítulo aprenderemos como funcionan las sesiones dentro de Rails y así poder preservar el estado de conexión de un usuario que se encuentre utilizando nuestra aplicación.


¿Qué son sesiones?

Las sesiones en una aplicación web se refieren a la asociación entre distintas peticiones HTTP realizadas por un usuario. Dicha asociación es realizada mediante el almacenamiento de un identificador único que a su vez es almacenado en el servidor y permite ser consultado entre peticiones. Debemos recordar que el protocolo HTTP no conserva un estado, cosa que imposibilita asociar diferentes peticiones HTTP y es por esta razón que surgen las sesiones.

Las sesiones dentro de Rails se encuentran dentro de la gema actionpack. Esta gema se instala automáticamente cuando instalamos Rails, pero si la quisiéramos instalar independientemente en un proyecto Sinatra basta con agregarla al Gemfile o ejecutar el comando gem install actionpack. Cabe destacar que las sesiones en Rails se utilizan en el controlador y vistas.


Utilizando Sesiones en Rails

Para esta pequeña introducción a las sesiones de Rails vamos a crear una tabla usuarios en base de datos la cual tendrá los siguientes campos:

  • email: con un tipo de dato string.
  • password: con un tipo de dato string.
  • remember_session: con un tipo de dato string.

Vamos a crear el modelo llamado Users con los campos antes descritos.

$ rails g model User email:string password:string remember_session:string

1 $railsgmodel User email:stringpassword:stringremember_session:string

Una vez que tengamos esto debemos realizar la migración para que nuestra tabla sea creada en base de datos.

Debemos tener en cuenta que este proyecto es completamente nuevo y utiliza cualquier tipo de base de datos que deseen (SQLite, MariaDB o Postgres) por lo general y si no modificaron el databases.yml trabajaremos sobre SQLite.

$ rake db:create $ rake db:migrate

12 $rake db:create$rake db:migrate

Agregamos un usuario a base de datos mediante el rails console para no tener que crear un formulario de crear usuario ya que queremos evitar el scaffolding en este curso.

@user = User.create(email: "[email protected]", password: "hola")

1 @user=Usercreate(email:"[email protected]",password:"hola")

Luego y posterior a tener el modelo con la tabla de base de datos debemos crear un controlador para manejar las sesiones de nuestra aplicación, puede tener el nombre que deseen. Por convención lo crearemos con el nombre Sessions en ingles, y crearemos únicamente los métodos necesarios (new, create, destroy)

$ rails g controller Sessions new create destroy

1 $railsgcontroller Sessions newcreate destroy

Posterior a lo que hemos realizado debemos crear las rutas para que el usuario pueda acceder a dichas funciones de la aplicación.

resources :sessions, only: [:new, :create, :destroy] get '/signin', to: 'sessions#new' get '/signout', to: 'sessions#destroy'

123 resources:sessions,only:[:new,:create,:destroy]  get'/signin',  to:'sessions#new'  get'/signout',to:'sessions#destroy'

Creamos un recurso llamado :sesions que tiene únicamente los métodos new, create, destroy. y además un par de rutas particulares de tipo get para utilizar los métodos new y destroy que se encuentran bajo el nombre de /signin para iniciar sesión y signout para destruir la sesión.

Agregamos a el archivo app/views/sessions/new.html.erb el siguiente formulario.

<%= form_for(:session, url: sessions_path) do |f| %> <%= f.label :email %> <%= f.text_field :email %> <%= f.label :password %> <%= f.password_field :password %> <%= f.label "Remember me" %> <%= f.check_box :remember_session %> <%= f.submit "Iniciar sesión" %> <% end %>

12345678910111213 &lt;%=form_for(:session,url:sessions_path)do|f|%>   &lt;%=flabel:email%>  &lt;%=ftext_field:email%>   &lt;%=flabel:password%>  &lt;%=fpassword_field:password%>   &lt;%=flabel"Remember me"%>  &lt;%=fcheck_box:remember_session%>   &lt;%=fsubmit"Iniciar sesión"%>&lt;%end%>

El formulario contiene todos los atributos existentes en nuestra base de datos en conjunto con sus etiquetas (labels).

Dentro del controlador de sesiones que creamos previamente y se encuentran vacíos, les agregaremos a los métodos create y destroy el siguiente contenido:

class SessionsController < ApplicationController def new end def create if user = User.find_by(params[:username], params[:password]) session[:current_user_id] = user.id redirect_to root_url else render 'new' end end def destroy # Remove the user id from the session @_current_user = session[:current_user_id] = nil redirect_to root_url end end

12345678910111213141516171819 classSessionsController&lt;ApplicationController  def new  end   def create  ifuser=Userfind_by(params[:username],params[:password])  session[:current_user_id]=userid  redirect_to root_url  else  render'new'  end  end   def destroy  # Remove the user id from the session  @_current_user=session[:current_user_id]=nil  redirect_to root_url  endend

Esto quiere decir que cuando el usuario se encuentre en el formulario de app/views/sessions/new.html.erb y presione el botón de submit para enviar la petición, la misma llegará a el controlador de SessionsController específicamente el método create el cual creará una sesión con el identificador que se encuentre base de datos para ese usuario y lo redireccionara a la pantalla principal de la aplicación indicando que el mismo se encuentra en sesión, de lo contrario recargará la página con el formulario. Luego encontramos el método destroy que se encarga de cerrar la sesión del usuario acceda al URL /signout asignandole el valor nil a la sesión existente para ese usuario.

Dentro del controlador principal de nuestra aplicación ApplicationController crearemos un método privado llamado current_user.

class ApplicationController < ActionController::Base private def current_user @_current_user ||= session[:current_user_id] & User.find_by(id: session[:current_user_id]) end end

123456789 classApplicationController&lt;ActionController::Base   private   def current_user  @_current_user||=session[:current_user_id]&  Userfind_by(id:session[:current_user_id])  endend

El método current_user es empleado para guardar el usuario que se encuentra en sesión y mediante este método podemos realizar consultas para impedir que un usuario modifique los datos personales de otro, almacenar en base de datos la persona que está realizando operaciones dentro de la aplicación, agregar items al carro de compra del usuario, etc…

De esta manera y con estos simples pasos hemos creado una sesión de usuario para el manejo del estado de conexiones dentro de nuestra aplicación, a esto se le pueden agregar otras funciones más que pueden ser activadas mediante filtros/acciones tales como conocer si el usuario que está realizando una petición se encuentra en sesión o no para permitirle realizar ciertas acciones.


Conclusión.

En esta lección aprendimos a utilizar el controlador de Rails para crear y destruir sesiones de usuario. Creamos un modelo de usuario, un controlador de sesiones y las rutas necesarias para poder acceder a las funciones dentro de nuestro controlador de sesiones. Todo esto con la finalidad de preservar el estado/acciones que realice el usuario dentro de nuestra aplicación. El próximo capítulo hablaremos sobre cookies y flashes para alertar al usuario. Siéntanse libres en consultar cualquier duda a través de los comentarios.

¡Hasta el próximo capítulo!


Volver a la Portada de Logo Paperblog