Introducción

1

Curso Intermedio de Ruby on Rails: Migración y Optimización Avanzada

2

Migración de Rails a MongoDB con Mongoid y Pruebas Automatizadas

3

Gestión de Múltiples Versiones de MongoDB en Linux

4

Migración de Rails a MongoDB con Mongoid: Configuración Inicial

5

Migración de Modelos de Active Record a Mongoid

6

Migración completa de aplicaciones con MongoDB y Rails

Pruebas

7

Pruebas Automatizadas: Introducción a TDD y BDD en Desarrollo de Software

8

Creación de Fábricas Automatizadas con FactoryBot y Faker en Rails

9

Integración de Librerías para Pruebas Automatizadas en Rails

10

Pruebas de Modelos en Rails con Mongoid y RSpec

11

Pruebas de Validación y Guardado en Modelos Rails

12

Validación y Pruebas de Modelos en Ruby on Rails

13

Pruebas de Integración en Rails: Configuración y Ejecución Básica

14

Creación y prueba de tareas con métodos POST en Rails

15

Automatización de Pruebas con Headless Browser y Capybara en Rails

16

Pruebas de Sistema con KPIBara y WebDriver en Rails

17

Automatización de Pruebas de Sistema con Selenium y JavaScript

Interacción dinámica

18

Uso de CoffeeScript con Rails y Webpacker: Integración y Ejemplos

19

Integración de Selectize con RAILs y Webpacker

20

Formularios Anidados en Rails: Uso de Simple Form y Cocoon

21

Implementación Selectize en Formularios Dinámicos con Kokoon y CafeScript

Notificaciones

22

Envío de Emails Automático al Crear Tareas

23

Introducción a Service Objects en Ruby on Rails

24

Pruebas de TDD para Service Object de Notificaciones por Correo

25

Creación de Service Objects para Envío de Correos en Ruby on Rails

26

Procesos en Background con Sucker Punch en Rails

27

Pruebas con Doubles en Rails usando Sucker Punch

Ciclos de vida

28

Máquinas de Estado Finito: Conceptos y Aplicaciones Prácticas

29

Creación de Máquinas de Estados con AASM en Ruby on Rails

30

Creación de Service Object para Gestión de Estados de Tareas en Rails

31

Acciones de Controlador y Pruebas en Ruby on Rails

32

Integración de AJAX en Gestión de Estados de Tareas en Ruby on Rails

Cierre

33

Optimización de rendimiento en aplicaciones web con Ruby on Rails

34

Migración y Pruebas Automatizadas en Ruby on Rails

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creación de Service Object para Gestión de Estados de Tareas en Rails

30/34
Recursos

¿Cómo crear un nuevo Service Object en Rails?

El desarrollo de aplicaciones en Rails puede ser sofisticado, pero incorporar un Service Object para manejar la gestión de estados ofrece una estructura más organizada. En este artículo, exploraremos cómo lograrlo utilizando un enfoque práctico y bien estructurado.

¿Qué es un Service Object?

Un Service Object en Rails es un patrón usado para encapsular lógica de negocio que no pertenece a un modelo o controlador específico. Esto es útil para evitar la sobrecarga de los controladores y modelos, a la vez que facilita el mantenimiento y la escalabilidad del código.

¿Por qué crear un Service Object para la gestión de tareas?

La principal razón para crear un Service Object para gestionar los estados de las tareas es establecer una capa intermedia. Esto permite que los componentes externos modifiquen los estados sin tener que interactuar directamente con el modelo de tarea. Aunque inicialmente la lógica pueda parecer básica, este enfoque es esencial para escalar la funcionalidad en el futuro.

Desarrollo del Service Object

Comencemos creando una prueba para nuestro nuevo servicio. En la carpeta spec/services/task, duplicamos un servicio existente, por ejemplo send_email_spec, y lo nombramos trigger_event_spec. En esta prueba, nos enfocaremos en verificar que nuestro servicio cambie correctamente el estado de la tarea y persista la transición.

Creación de la prueba

Utilizaremos un fragmento del código como referencia:

require "rails_helper"

RSpec.describe TriggerEvent do
  subject { described_class.new(task, event) }

  let(:task) { create(:task) }
  let(:event) { "start" }

  context "cuando se llama a trigger_event" do
    it "cambia el estado de la tarea a 'in_process'" do
      expect { subject.call }.to change { task.status }.to("in_process")
    end

    it "registra una transición" do
      expect { subject.call }.to change { task.transitions.count }.by(1)
    end
  end
end

En este código, estamos asegurando que dos importantes verificaciones ocurran:

  1. El estado de la tarea cambia a "in_process".
  2. Se registra una nueva transición.

Implementación del Service Object

Después de crear la prueba, procedemos a la implementación del Service Object. Dentro de app/services/task/, duplicamos el servicio send_email.rb y lo renombramos a trigger_event.rb. Cambiamos la lógica para que coincida con nuestros requisitos.

class TriggerEvent
  def initialize(task, event)
    @task = task
    @event = event
  end

  def call
    @task.send("#{@event}!") # Utiliza metaprogramación para invocar el método
    # Aquí se podrían añadir más funcionalidades si fuera necesario
  end
end

En este ejemplo simple, utilizamos Ruby para invocar dinámicamente métodos en la tarea. La metaprogramación facilita futuras expansiones, permitiendo añadir seguridad, políticas de acceso, o conexiones adicionales con otros servicios.

Probando el Service Object

Finalmente, validamos nuestro Service Object ejecutando las pruebas. Navegamos a la consola de comandos y ejecutamos:

rspec spec/services/task/trigger_event_spec.rb

Esperamos ver resultados de éxito que confirmen que nuestro servicio funciona correctamente.

¿Qué tal si ampliamos nuestras habilidades?

Este es el momento perfecto para llamar a la acción. Ahora que has aprendido cómo crear un Service Object para gestionar el cambio de estados de una tarea, te desafío a crear uno para gestionar la creación de un código post-tarea. Este ejercicio consolidará tu comprensión y mejorará tu habilidad en Rails. ¡Buena suerte!

Aportes 1

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

#services/tasks/generate_code.rb

class Tasks::GenerateCode
  def call(task)
    task.code = "#{task.owner_id}#{Time.now.to_i.to_s(36)}#{SecureRandom.hex(8)}"
    [ true, 'successful' ]
  rescue => e
    Rails.logger.error e
    [ false, 'failed' ]
  end
end