La primera habilidad a adquirir para este curso es ser capaces de generar un CRUD utilizando los scaffolds de Rails.
Para ello lo que haremos será comenzar a desarrollar una pequeña tienda online. Esta semana sólo es necesario realizar la gestión de productos, es decir, su alta, edición, eliminación y, por supuesto, una pantalla para visualizar cada registro.
Los productos tendrán los siguientes campos:
-
Nombre: tipo texto, no más de 255 caracteres
-
Descripción: Texto largo
-
Fecha de alta en el almacén: tipo fecha hora
-
Fabricante: Tipo texto
-
Cantidad en el almacen: Numérico
Durante esta tercera semana del curso vamos a desarrollar nuestras habilidades para ser capaces crear migraciones que nos permitan modificar la estructura de nuestra base de datos, aprenderemos como realizar queries usando Active Record y veremos como crear relaciones entre nuestros modelos.
Para ello retomaremos la aplicación de tienda Online que creamos en la primera semana y la ampliaremos para recoger la siguiente funcionalidad:
-
Nuestro cliente quiere que se puedan hacer compras sobre los productos que ha introducido en la base de datos usando el scaffold que desarrollamos la primera semana.
-
La estructura que vamos a crear en la base de datos deberá tener por un lado una tabla pedido (Order) para la cuál realizaremos un nuevo scaffold. Este modelo almacenará el estado del pedido, medio de pago, dirección de envío, ciudad de envío, y nombre y apellidos del comprador.
-
Por otro lado, para introducir cada uno de los productos que van en un pedido crearemos un modelo relación que recogerá cada línea de pedido (LineItem) que contendrá el producto que se ha comprado, la cantidad y precio por el que se ha comprado. Para crear este modelo NO lo haremos usando un scaffold para ello tendremos que usar el generador de modelos ya que no necesitamos ni el controlador ni las vistas que crearía el scaffold.
-
Finalmente habrá que conectar estos dos modelos entre si y con productos.
Para realización de este ejercicio no será necesario modificar ni las vistas, ni el controlador de Order para que acepte LineItems. Esa tarea la realizaremos la semana que viene cuandoveamos las vistas y los helpers de los formularios.
-
Por otro lado, a nuestro cliente se le olvido decirnos que cada producto tiene una categoría, necesaria para clasificar los productos, que se corresponderá con un varchar en base de datos.
Para esta tarea habrá que modificar la tabla Products usando para ello una migración.
github.com/murtra/shop/tree/beaaf4d7eb90579e10d60b3950d4bd122f2475e2
El cuarto ejercicio del curso de Rails está centrado en las vistas, aunque para completarlo necesitaremos tocar un poco los modelos y ligeramente un controlador. También será el primero que necesitaremos programar un poco. Para realizar el ejercicio continuaremos trabajando sobre el código de nuestra tienda Online. En esta ocasión nuestro cliente desea que sea posible seleccionar los productos que vamos a comprar directamente desde el formulario del pedido (Order). En concreto, debemos mostrar bajo los campos del pedido, una entrada para cada LineItem, con su correspondiente cantidad, y un campo para seleccionar el producto que sea desea comprar. Una vez se guarde este formulario, deberemos crear en base de datos un Order y un LineItem por cada uno de los productos que se hayan comprado. Por otro lado, aunque en primera instancia el formulario deberá mostrar sólo una entrada de LineItem, deberemos tener disponible un enlace que nos permita añadir más elementos dinámicamente. Para ello deberemos programar esta funcionalidad usando un poco de javascript. También deberemos permitir el borrado de LineItems, tanto aquellos que han sido guardados en base de datos como los que todavía no lo han sido. Una vez guardado el Pedido, deberá mostrarse en la pantalla de detalle los datos básicos del pedido, los productos comprados, junto a su cantidad y su precio correctamente formateado. Para finalizar, se valorará positivamente que añadir un poco de colorido a la aplicación usando para ello scss.
github.com/murtra/shop/tree/7e794ee8280ce381cee950bcde4418fe2b81c539
Durante esta semana aprenderemos el funcionamiento de los controladores en Rails. Para ello necesitaremos aprender a recibir los parámetros de una request, usar filtros y gestionar la sesión y las cookies. Continuando con nuestra pequeña tienda online, nuestro cliente necesita que añadamos la posibilidad de que los compradores puedan registrarse en la web, y por supuesto iniciar una sesión antes de hacer un pedido. Para la realización de esta funcionalidad necesitaremos guardar los datos del alta de los usuarios: Nombre, apellidos, email, por supuesto, una contraseña (para esto nos valdría un scaffold). Para gestionar la contraseña del usuario deberéis usar el método has_secure_password de Active Record descrito en el vídeo sobre autorización en la unidad. Por otro lado necesitaremos crear un formulario para que el usuario pueda iniciar sesión, para ello deberemos crear un controlador SessionsController, que será el encargado de autentificar al usuario, y las vistas correspondientes. Por último deberemos habilitar unos enlaces en la cabecera para que el usuario pueda ir al formulario de inicio de sesión y cerrar la sesión una vez realizada la compra. También sería interesante, que tanto la gestión de productos como la creación de nuevos pedidos sólo fuera accesible estando logado en el sistema.
github.com/murtra/shop/tree/554edc1b95d57f4f6f604a8fb784cdd9ce3913a6
Esta semana vamos a profundizar un poco más con el tema de Active Record. En esta ocasión vamos a ver como se usan las validaciones, qué son y cómo se usan los callbacks y cómo podemos refactorizar nuestras queries mediante el uso de scopes.
Para ello, vamos a añadir validaciones a todos los modelos. Sé que alguno ya lo ha hecho, pero el que todavía no lo haya hecho este es el momento. Las validaciones a añadir serían las siguientes: Usuario: ● Campos obligatorios: nombre, email y por supuesto el password. ● Validación de que el email tiene un formato correcto. ● Validación de que el password tiene al menos 8 caracteres, al menos uno numérico, al menos un carácter. Productos: ● Campos obligatorios: Nombre, fecha de registro, cantidad en el almacén, precio. ● Campos numéricos: Cantidad y precio. ● La categoría debe ser: libros, música & peliculas, electrónica, hogar, juguetes, ropa, comestibles, o estar vacía. ● Campo único: nombre del producto. Pedidos: ● Campos obligatorios: Nombre del comprador y apellidos, dirección, ciudad, método de pago, estado. ● El método de pago debe ser: en efectivo, tarjeta o paypal. ● El estado debe ser: Pendiente, Enviado, Recibido. Lineas de Pedido: ● Campos obligatorios: product_id, cantidad, y precio. ● Campos numérico: cantidad y precio. Por otro lado necesitamos automatizar algunos procesos dentro de la aplicación que deberán ser implementados usando callbacks:
-
El campo precio de la línea de pedido no debe aparecer en el formulario, y deberá ser
rellenado automáticamente al guardar el pedido con el precio del producto en ese momento.2. Al mismo tiempo, se deberá descontar la cantidad del producto que ha sido comprado de la tabla de productos, para mantener actualizado el número de productos en el almacén.
-
En el formulario del Pedido, no deberá aparecer el campo estado, y deberá ser rellenado
a ‘Pendiente’ en el momento de la creación, para la posterior revisión de un encargado.
-
En el formulario de edición de pedido se deberá poder cambiar el estado del pedido.
Por último, en la página del listado de pedido habrá que añadir una serie de filtros:
-
Por categoría
-
Cantidad de producto en el almacén.
-
Fecha de registro.
-
Fabricante.
-
Rango de precio.
Las queries necesarias para realizar estos filtros deberán ser implementadas en el modelo Product como scopes y usadas desde el controlador ProductsController.
github.com/murtra/shop/tree/80762b24f1fe91368be938ed1f1abf3f2fa74212
Esta semana vamos a trabajar por un lado los Mailers, y por otro lado, la internacionalización. Action Mailer es el módulo de Rails encargado del envío de emails. Los mailers son muy parecidos a los controllers en su funcionamiento, pero con la diferencia que las vistas que se generan son enviadas por email.
Todos los mailers heredan de la clase ActionMailer::Base, y al final de cada uno de sus métodos debemos llamar al método mail, que será el encargado de generar el email. Para enviar el correo usando un mailer simplemente debemos llamar al método que deseemos seguido del método deliver, por ejemplo, UserMailer.signup(user).deliver. I18n es el módulo de Rails encargado de internacionalizar la aplicación. Se encarga tanto de traducir los textos al idioma deseado como de los cambios de formato tanto de fechas como de monedas.
Consta de dos métodos fundamentales, translate (I18n.t) y localize(I18n.l). Los ficheros de localización se guardan en la carpeta config/locale, seguido del código del idioma y luego el normalmente el nombre del controlador, y el formato en el que se guarda es yml. Por ejemplo, config/locales/es/users.yml
El idioma de nuestra app puede ser configurado desde el application.yml, pero también cambiado dinámicamente usando, por ejemplo, I18n.locale = :es
Esta semana nuestro cliente desea que añadamos a nuestra tienda Online la capacidad de enviar un email de resumen a sus compradores una vez hayan completado un pedido. En este email deberemos mostrar los datos que forman un pedido, junto con cada uno de los productos que se han comprado, cantidad, precio de los mismos, y el precio total del pedido.
Por otro lado, la otra funcionalidad que nuestro cliente nos pide es un par de enlaces en el pie de la página para cambiar de idioma entre español e inglés. Cuando se haga click en uno de esos enlaces, todos los textos de la aplicación deben cambiar al idioma seleccionado.
En esta octava semana de curso vamos a trabajar un poco con el testing. Un test es un programa que comprueba la validez de otro. En nuestro caso haremos tests que comprueben que nuestros modelos, controllers, helpers o vistas funcionan correctamente. Para ello vamos a utilizar una librería de test muy popular en el mundo ruby denominada Rspec.
El primer paso será instalarnos Rspec: cursos.aspgems.com/topics/15testing/contents/490
En segundo lugar será necesario revisar todos los vídeos de Code School publicados en la unidad: cursos.aspgems.com/courses/1rubyonrails/topics/15testing/videos
Y el tercer paso sería revisar las recomendaciones generales de BetterSpecs: cursos.aspgems.com/topics/15testing/contents/482
Como bola extra, podréis aprender ampliar conocimientos con el libro Everyday Rails Testing: cursos.aspgems.com/topics/15testing/contents/489
En todos los casos, espero vuestras valoraciones sobre la utilidad de cada uno de los contenidos. Para terminar, deberéis realizar al menos un par de test en vuestro aplicación, al menos uno de modelo y otro de controlador. Evidentemente cuántos más hagáis mejor porque más vais a aprender, pero no os voy a definir cuales ya que cada uno habéis hecho la aplicación de forma distinta.