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

  1. 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.

  1. 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

  1. 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 %>

  1. 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

  1. 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:

class Comment < ApplicationRecord
  belongs_to :article
  belongs_to :user
end

Ejemplo: Asociación en el Modelo de Artículo:

class Article < ApplicationRecord
  has_many :comments, dependent: :destroy
end

Ejemplo: Asociación en el Modelo de Usuario:

class User < ApplicationRecord
  has_many :comments, dependent: :destroy
end

  1. 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:

gem 'bcrypt', '~> 3.1.7'

Ejemplo: Modelo de Usuario con Autenticación:

class User < ApplicationRecord
  has_secure_password
end

  1. 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:

  1. Crear el Modelo de Like:

    rails generate model Like user:references article:references
    rails db:migrate
    
  2. Actualizar el Modelo de Artículo:

    class Article < ApplicationRecord
      has_many :likes, dependent: :destroy
    end
    
  3. Actualizar el Modelo de Usuario:

    class User < ApplicationRecord
      has_many :likes, dependent: :destroy
    end
    
  4. 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
    
  5. 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!

© Copyright 2024. Todos los derechos reservados