Cargando



Construir login de nuestra aplicación Ruby on Rails

En este tutorial veremos cómo construir la parte de log-in de nuestra aplicación, donde le daremos identidad al usuario dentro de nuestra aplicación con Ruby on Rails.



oct 22 2014 11:32
Avanzado
oct 23 2014 12:03
En nuestras aplicaciones web casi siempre vamos a tener que registrar usuarios, de esta forma tendremos miembros de nuestras tiendas, blogs, comunidades virtuales, sistemas administrativos, etc. Para que el registro sea efectivo y útil, luego estos usuarios deben ser capaces de autenticarse para poder ingresar a partes que hayan sido creadas para usuarios registrados, como ver su perfil, administrar sus mensajes, realizar compras, escribir artículos, etc.

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.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X