Ingresando a la aplicación log-in
El log-in es la parte vital de nuestra aplicación, nos permite separar lo privado de lo público, nos permite saber qué perfil tiene cada usuario que ingresa y con ello decidir que puede ver o no.
Para que nuestra aplicación tenga esta funcionalidad, necesitamos una acción en el controlador que nos permita autenticar al usuario comparando su usuario y contraseña contra lo que tenemos en base de datos, luego una vez que pase esto debemos guardar en la sesión algunos valores que nos permita saber en todo momento quien está logueado y que perfil y permisos tiene, claro esto último depende mucho del diseño de nuestra aplicación.
Ya a estas alturas debemos saber generar un controlador y todo lo relacionado con la consola de rails, por lo que veremos directamente el controlador y su contenido, así como también veremos la lógica detrás del mismo:
def login if request.get? session[:user_id] = nil @user = User.new else @user = User.new(params[:user]) logged_in_user = @user.try_to_login if logged_in_user session[:user_id] = logged_in_user.id redirect_to(:action => "index") else flash[:notice] = "Invalid user/password combination" end end end
En la primera parte con el condicional IF de nuestro controlador preguntamos por el request, si es GET limpiamos la sesión y creamos un nuevo objeto de tipo usuario, de esta forma preparamos el camino para ingresar. De no ser GET el request asumimos que es POST, entonces a nuestro objeto le pasamos los parámetros del formulario y luego llamamos al método try_to_login, este método lo que hace es hacer las comparaciones de nombre de usuario y contraseña contra lo que tenemos en base de datos.
Por último con otro condicional vemos si el usuario efectivamente fue logueado, asignamos valores al sesión y luego redirigimos el usuario al index, de lo contrario mostramos un error con un mensaje.
El modelo
Como vimos en el controlador llamamos algunos métodos que nos permiten hacer las comparaciones correspondientes, ahora lo que necesitamos es crear dichos métodos y para ello vamos a hacerlo en el modelo, veamos que contiene y el por qué lo contiene:
def self.login(name, password) hashed_password = hash_password(password || "") find(:first, :conditions => ["name = ? and hashed_password = ?", name, hashed_password]) end def try_to_login User.login(self.name, self.password) end
El método login es simple, recibe dos parámetros: nombre y contraseña, luego consulta contra la base de datos por estos valores.
El método try_to_login, lo que hace es invocar al método login, de esta forma podemos darle una respuesta al usuario si existe o no en nuestra base de datos.
Por último creamos nuestra vista y las acciones que utilizará, en el archivo app/views/login crearemos nuestro login.rhtml y también nuestro index.rhtml, el primero es bastante similar a la construcción del usuario y este segundo lo veremos ahora.
<% @page_title = "Administer your Store" -%> <h1>Depot Store Status</h1> <p> Total orders in system: <%= @total_orders %> </p> <p> Orders pending shipping: <%= @pending_orders %> </p>
Como vemos es bastante sencillo simplemente mostrará las ordenes pendientes del usuario, para ello en el controlador debemos incorporar las acciones necesarias:
def index @total_orders = *****.count @pending_orders = *****.count_pending end
Ahí tendríamos visto el resultado.