En esta sección, nos enfocaremos en la implementación de funcionalidades para el proyecto final. Este es un paso crucial donde aplicaremos todos los conceptos aprendidos a lo largo del curso para construir una aplicación funcional y robusta.
Objetivos
- Implementar las funcionalidades principales del proyecto.
- Aplicar principios de diseño y buenas prácticas de programación.
- Asegurarse de que el código sea mantenible y escalable.
Pasos para Implementar Funcionalidades
- Definir Requisitos Funcionales
Antes de comenzar a codificar, es esencial tener una lista clara de los requisitos funcionales. Estos son los comportamientos y características que la aplicación debe tener.
Ejemplo de Requisitos Funcionales:
- Los usuarios deben poder registrarse y autenticarse.
- Los usuarios deben poder crear, leer, actualizar y eliminar (CRUD) artículos.
- Los usuarios deben poder comentar en los artículos.
- Crear Modelos y Migraciones
Los modelos representan las entidades de la aplicación y las migraciones se utilizan para definir la estructura de la base de datos.
Ejemplo: Crear un modelo de Usuario y una migración:
# Generar el modelo de Usuario rails generate model User name:string email:string password_digest:string # Ejecutar la migración rails db:migrate
- Implementar Controladores y Vistas
Los controladores manejan la lógica de la aplicación y las vistas presentan la información al usuario.
Ejemplo: Controlador de Usuarios:
class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to @user, notice: 'Usuario creado exitosamente.' else render :new end end def show @user = User.find(params[:id]) end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end
Ejemplo: Vista de Registro de Usuario (new.html.erb
):
<h1>Registro de Usuario</h1> <%= form_with(model: @user, local: true) do |form| %> <% if @user.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@user.errors.count, "error") %> impidieron que el usuario se guardara:</h2> <ul> <% @user.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :name %> <%= form.text_field :name %> </div> <div class="field"> <%= form.label :email %> <%= form.email_field :email %> </div> <div class="field"> <%= form.label :password %> <%= form.password_field :password %> </div> <div class="field"> <%= form.label :password_confirmation %> <%= form.password_field :password_confirmation %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>
- Añadir Funcionalidades CRUD
Para cada entidad principal, implementaremos las operaciones CRUD.
Ejemplo: Controlador de Artículos:
class ArticlesController < ApplicationController def index @articles = Article.all end def show @article = Article.find(params[:id]) end def new @article = Article.new end def create @article = Article.new(article_params) if @article.save redirect_to @article, notice: 'Artículo creado exitosamente.' else render :new end end def edit @article = Article.find(params[:id]) end def update @article = Article.find(params[:id]) if @article.update(article_params) redirect_to @article, notice: 'Artículo actualizado exitosamente.' else render :edit end end def destroy @article = Article.find(params[:id]) @article.destroy redirect_to articles_url, notice: 'Artículo eliminado exitosamente.' end private def article_params params.require(:article).permit(:title, :body) end end
- Añadir Comentarios a los Artículos
Para permitir que los usuarios comenten en los artículos, necesitaremos un modelo de Comentario y las asociaciones necesarias.
Ejemplo: Modelo de Comentario:
Ejemplo: Asociación en el Modelo de Artículo:
Ejemplo: Asociación en el Modelo de Usuario:
- Implementar Autenticación
Para manejar la autenticación de usuarios, podemos usar la gema bcrypt
para el hashing de contraseñas.
Ejemplo: Añadir bcrypt
al Gemfile:
Ejemplo: Modelo de Usuario con Autenticación:
- Pruebas y Validaciones
Asegúrate de que todas las funcionalidades estén cubiertas por pruebas y que los modelos tengan las validaciones necesarias.
Ejemplo: Validaciones en el Modelo de Usuario:
class User < ApplicationRecord has_secure_password validates :name, presence: true validates :email, presence: true, uniqueness: true end
Ejemplo: Pruebas Unitarias para el Modelo de Usuario:
require 'test_helper' class UserTest < ActiveSupport::TestCase test "should not save user without name" do user = User.new(email: "[email protected]", password: "password") assert_not user.save, "Saved the user without a name" end test "should not save user with duplicate email" do user1 = User.new(name: "Test", email: "[email protected]", password: "password") user1.save user2 = User.new(name: "Test2", email: "[email protected]", password: "password") assert_not user2.save, "Saved the user with duplicate email" end end
Ejercicio Práctico
Implementa una funcionalidad adicional en tu proyecto. Por ejemplo, permite que los usuarios puedan dar "me gusta" a los artículos.
Pasos:
-
Crear el Modelo de Like:
rails generate model Like user:references article:references rails db:migrate
-
Actualizar el Modelo de Artículo:
class Article < ApplicationRecord has_many :likes, dependent: :destroy end
-
Actualizar el Modelo de Usuario:
class User < ApplicationRecord has_many :likes, dependent: :destroy end
-
Crear el Controlador de Likes:
class LikesController < ApplicationController def create @article = Article.find(params[:article_id]) @like = @article.likes.build(user: current_user) if @like.save redirect_to @article, notice: 'Te ha gustado este artículo.' else redirect_to @article, alert: 'No se pudo dar me gusta al artículo.' end end def destroy @like = Like.find(params[:id]) @like.destroy redirect_to @like.article, notice: 'Ya no te gusta este artículo.' end end
-
Actualizar las Vistas de Artículos para Mostrar y Gestionar Likes:
<!-- En show.html.erb de Artículos --> <p> <strong>Likes:</strong> <%= @article.likes.count %> </p> <% if current_user %> <% if @article.likes.exists?(user: current_user) %> <%= button_to 'Unlike', article_like_path(@article, @article.likes.find_by(user: current_user)), method: :delete %> <% else %> <%= button_to 'Like', article_likes_path(@article), method: :post %> <% end %> <% end %>
Solución:
Revisa tu implementación y asegúrate de que:
- Los usuarios pueden dar y quitar "me gusta" a los artículos.
- La cuenta de "me gusta" se actualiza correctamente.
- Las pruebas cubren la nueva funcionalidad.
Conclusión
En esta sección, hemos cubierto cómo implementar funcionalidades clave en tu proyecto final. Desde la definición de requisitos hasta la implementación de modelos, controladores y vistas, y la adición de nuevas características como los "me gusta". Asegúrate de seguir buenas prácticas y realizar pruebas exhaustivas para garantizar la calidad de tu aplicación. ¡Ahora estás listo para continuar con las pruebas y depuración en la siguiente sección!
Curso de Programación en Ruby
Módulo 1: Introducción a Ruby
Módulo 2: Conceptos Básicos de Ruby
Módulo 3: Trabajando con Colecciones
Módulo 4: Programación Orientada a Objetos en Ruby
- Clases y Objetos
- Variables y Métodos de Instancia
- Variables y Métodos de Clase
- Herencia
- Módulos y Mixins
Módulo 5: Conceptos Avanzados de Ruby
- Bloques, Procs y Lambdas
- Metaprogramación
- Manejo de Excepciones
- Entrada/Salida de Archivos
- Expresiones Regulares
Módulo 6: Introducción a Ruby on Rails
- ¿Qué es Ruby on Rails?
- Configuración del Entorno Rails
- Creando una Aplicación Simple en Rails
- Arquitectura MVC
- Enrutamiento
Módulo 7: Pruebas en Ruby
- Introducción a las Pruebas
- Pruebas Unitarias con Minitest
- Desarrollo Guiado por Comportamiento con RSpec
- Mocking y Stubbing
Módulo 8: Mejores Prácticas en Ruby
- Estilo de Código y Convenciones
- Refactorización
- Optimización del Rendimiento
- Mejores Prácticas de Seguridad