Abriendo una Web App Ruby On Rails- Welcome aboard 2ª Parte


Sin títuloEn la primera parte hablábamos de conceptos como CRUD, las tablas que necesitábamos  y las rutas que nos indican el camino a seguir hasta encontrar el recurso marcado. Puedes ampliar la información en Abriendo un Web App Ruby On Rails – Welcome aboar 1º Parte.

Una de las cosas interesantes de Rails es la creación de Apps y su estructura Modelo, Vista y Controlador, en la que nuestros Modelos se encargan del mantenimiento del estado de la aplicación y es algo más que datos, la Vista se encarga de la generación de la interfaz con el usuario y generalmente se basa en los datos del modelo y el Controlador dirige la aplicación.

Veamos como funciona la aplicación

Cuando lanzamos la petición http:/localhost:3000 le estamos indicando que primero lo que debe hacer, pero tiene que saber ¿qué tengo que mostrar? para eso tiene el fichero de rutas que tendrá entre otras cosas una sentencia que se denomina root y que es la principal, en nuestro caso root :to => “products#index”, esto quiere decir: cuando estemos en la raiz de las peticiones http://localhost:3000, tienes que ir al controlador products y dentro del controlador ve a  la acción index. Pero antes de pasar directamente por el controlador products_controller.rb, antes pasamos por un controlador general que se llama applicaction_controller.rb y aquí tenemos una serie de métodos definidos que nos van a  permitir realizar las operaciones de, antes de mostrar nada compruebame que el usuario ha hecho login  en la aplicación, si no es así, solicita los datos de entrada de acceso a la aplicación o el registro de “un nuevo usuario” si no está ya registrado. Veamos el código de este controlador applicacion_controller.rb:

class ApplicationController < ActionController::Base
protect_from_forgery

helper_method :logged_in?, :current_user, :is_admin? ====> la definición de este “helper_method” nos va a ser útil cuando lo necesitemos llamar en una vista

before_filter :login_required   ====> en esta sentencia le estamos diciendo antes de nada comprueba que se requiere login de acceso, compruébalo. Y para eso tenemos un método que lo comprueba pero fíjate en un detalle. El método lo tenemos protegido con private. 
# Admin user who’s that?
def is_admin?
current_user.is_admin
end

# User sections
def current_user
if logged_in?
@current_user = User.find session[:user_id]
end
end

def logged_in?
session[:user_id] ? true : false
end
private

def login_required
unless logged_in?
redirect_to login_url ====> en caso que ya ha hecho login in en la aplicación lo llevamos a login_url
end
end

end

Ahora cuando hemos dicho que le enviamos a login_url mediante la sentencia redirect_to login_url, es el resultado de una ruta en la que tenemos que saber hacia dónde va, controlador acción siguiente. En este caso si vemos nuestro fichero de rutes.rb en el directorio de config, disponemos de   get     “login”       => “sessions#new”,         :as => “login” en la que ya le estamos diciendo dónde debe ir, al controlador sessions y a la acción new. Esto lo hacemos con un método vacío (no necesitamos hacer nada en el controlador)  new, ¿por qué lo hacemos así? recuerda que  new crea un nuevo recurso y lo pasa al cliente (navegador), como un formulario que se crea para que lo rellene el usuario. Pues esa es nuestra intención de haber creado un método new para llevarlo a la vista en la que ya tenemos el formulario new.html.erb. En el controlador de session_controller.rb tenemos el siguiente código:

class SessionsController < ApplicationController

skip_before_filter :login_required, : only => [:new, :create] ====> Necesitamos ejecutar las acciones de create y new sin pasar por :login_required, para eso necesitamos declarar el filtro skip_before_filter, para dichas acciones  se ejecuten sin preguntar ya que en ApplicationController y siendo un controlador general, nos solicita el login_required.  Los filtros son métodos que se ejecutan antes, después o “alrededor” de una acción del controlador, además los filtros se heredan, por lo que si se establece un filtro en ApplicationController , se ejecuta en todos los controladores de la aplicación.

def new
end

def create

user = User.find_by_email(params[:email]) ====> comprobamos si tenemos registrado al usuario en la base de datos tabla users.

if user && user.authenticate(params[:password]) ====> comprobamos la clave y el usuario sean las mismas en nuestra tabla de usuarios.
session[:user_id] = user.id ====> guardamos la sesión con el id de nuestro usuario para que cuando llamemos a nuestro método def logged_in? session[:user_id] ? true : false podamos saber si está presente o no.
redirect_to products_path ====> si ya lo hems identificado ya podemos entrar y ver lo productos.
else
    flash.now.alert = “Bad Combination Loggin or Password” ====> en caso contrario le damos un aviso en la vista de login.
render :new ====> y volvemos a la petición de login nuevamente a solicitar los datos de entrada a la aplicación.
end

end

def destroy

session[:user_id] = nil
redirect_to login_path
end

end

Y para la vista a través del layout en la parte yield se ejecuta el trozo de código requerida:

<section id=”content”>
<%= yield %>
</section>

y nos rellena en yield con la vista correspondiente de new en la que tenemos el siguiente código:

<h1>Welcome to my WebShop 2.0</h1>
<%= notice %>
<%= alert %> ====> en SessionsController tenemos el código para enviar a la vista: flash.now.alert = “Bad Combination Loggin or Password”
<%= form_tag sessions_path do %>  ====> cada vez que ejecutamos el formulario estamos llamando a la acción de create del controloador SessionsController
<%= label_tag “:email”, “Email” %>
<%= text_field_tag :email, params[:email] %><br />
<%= label_tag :password, “Password” %>
<%= password_field_tag :password %><br />
<%= submit_tag “Login” %>
<% end %>
<p>
<%= link_to “Register User”, new_user_path %>
</p>

Finalmente tenemos en la vista general application.html.erb:

<!DOCTYPE html>

<html>
<head>
<meta charset=”utf-8″>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″>
<title>—————–CSP Webshop NEW——————————</title>
<%= stylesheet_link_tag “normalize”, “application”, :media => “all” %>
<%= javascript_include_tag “application” %>
<%= csrf_meta_tags %>
</head>
<body>

<%= render “shared/menu” %> se traduce en el código siguiente:

Tenemos lo que habíamos comentado anteriormente de sobre los helper method de los que necesitamos de ellos en las vistas, para que hagan cosas que no serían bien vistas de una forma directa:

<% if logged_in? %> ====> si esta identificado entonces se muestran los links de productos y si es administrador se muestra la creación de usuarios.

<%= link_to image_tag(“rails.png”, alt: “Rails”) %>
<nav>
<ul>
<li><%= link_to “Products”, products_path %></li>
<% if is_admin? %>
<li> <%= link_to “Users”, users_path %></li>
<% end %>
</ul>
</nav>

<% end %>


<%= welcome_user %>

para la parte de welcome_user se traduce en el código siguiente:

module ApplicationHelper
        def alert
if flash[:alert]
“<p>#{flash[:alert]}</p>”.html_safe
end
end

         def notice
if flash[:notice]
“<p>#{flash[:notice]}</p>”.html_safe
end
end

        def welcome_user
if logged_in?
“<p>Hello again #{current_user.firstname} #{current_user.lastname} – #{link_to “Logout”, logout_path}</p>”.html_safe
end
end
end

<section id=”content”>

<%= yield %> ====> lo rellena con la vista solicitada en el caso que hemos visto los campos de petición de entrada a la aplicación.
</section>

</body>
</html>

Seguiremos analizando todos los pasos de la aplicación Web en Ruby On Rails.

Un comentario en “Abriendo una Web App Ruby On Rails- Welcome aboard 2ª Parte

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s