Manejo de Formularios Anidados con Cocoon en Rails

Clase 26 de 36Curso de Introducción a Ruby on Rails

Resumen

¿Cómo manejar formularios anidados en HTML con múltiples modelos?

Manejar formularios anidados en proyectos HTML puede ser un desafío, especialmente cuando intervienen más de un modelo. Para facilitar este proceso, existe una herramienta llamada Cocoon, que es particularmente útil en entornos Rails. En esta clase, aprenderemos a integrar dos modelos: Task y Participant, utilizando esta potente gema.

¿Cómo instalamos Cocoon?

Para comenzar a usar Cocoon, el primer paso es instalarla en tu proyecto. Este procedimiento involucra tanto Ruby como JavaScript, debido a una dependencia necesaria.

  1. Añadir Cocoon al Gemfile: Ubica el archivo Gemfile en tu editor y en alguna línea, como por ejemplo la 29, agrega gem 'cocoon'.

  2. Instalar la gema: Navega a la consola de comandos y ejecuta:

    bundle install
    

    o su alias bi.

  3. Dependencias de JavaScript: Cocoon requiere algunas dependencias, principalmente relacionadas con jQuery. Aunque Cocoon aún no está completamente migrada a la nueva versión de Rails, se puede utilizar una versión específica desde un commit en GitHub.

  4. Configurar Webpack: Modifica en tu archivo application.json, ubicado en app/javascript/packs/application.js, usando import para incluir Cocoon. Configura jQuery y otras dependencias en environment.js dentro de la carpeta config/webpack.

    const { environment } = require('@rails/webpacker');
    const webpack = require('webpack');
    
    environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      'window.jQuery': 'jquery',
      Popper: ['popper.js', 'default']
    }));
    
    module.exports = environment;
    

¿Cómo enlazamos participantes con tareas?

Una vez configurado Cocoon, es momento de enlazar nuestro modelo Participant al formulario de tareas mediante un formulario simple anidado.

  1. Configuración del formulario: Dentro de la carpeta app/views/tasks, ubica el formulario al que quieres asociar los participantes.

  2. Uso de Simple Fields Form: Este método del SimpleForm permite asociar un modelo anidado.

    = f.simple_fields_for :participants do |p|
      .participant-fields
        = render 'participant_fields', f: p
    
  3. Creación de un parcial: Este parcial alojará la configuración del modelo Participant, y se denominará _participant_fields.

    .nested-fields
      = f.input :user_id, collection: User.all - [current_user]
      = f.input :role
    

¿Cómo ajustamos el modelo Participant?

Es crucial configurar correctamente el modelo Participant para que la asociación y los roles se manejen adecuadamente.

  1. Referencias y modelos: Asegúrate que el modelo Participant tiene asociaciones establecidas apropiadamente con las tareas y usuarios.

  2. Rol de los participantes: Para determinar roles, el modelo Participant puede tener un atributo entero que especifique si un usuario es responsable o seguidor.

    def role_description
      case role
      when 1
        'Responsable'
      when 2
        'Seguidor'
      else
        'Sin definir'
      end
    end
    
  3. Evitar que el CurrentUser aparezca en el listado: Utiliza operaciones con arrays para excluir al usuario actual de los selects.

Incorporar Cocoon para manejar formularios anidados en Rails es una habilidad crucial que simplifica el desarrollo al permitir asociaciones complejas entre modelos. Nunca dudes en explorar nuevas configuraciones y sigue practicando para dominar estas herramientas, con lo cual enriquecerás tus proyectos y habilidades.