Ruby on Rails es un framework que busca crear aplicaciones de forma rápida y simple, mejorando la experiencia de los desarrolladores. Esto se debe a su enfoque en convención vs configuración, asumiendo cuál es la mejor manera de hacer ciertas cosas, lo que se conoce como el Rails way.
¿Qué es Scaffold?
Scaffold es una herramienta que nos ofrece Rails para poder generar una estructura básica del CRUD de un modelo en nuestros proyectos.
CRUD
El término CRUD representa las cuatro operaciones básicas de una aplicación web:
Crear (Create), Leer (Read), Actualizar (Update) y Eliminar (Delete)
Tradicionalmente lo que hariamos sería escribir manualmente cada uno de los componentes necesarios para crear el CRUD, esto significa definir el controlador, el modelo, las vistas y las rutas uno por uno.
Como se hace el CRUD de un modelo sin scaffold:
En este caso crearemos un modelo de productos, en donde cada producto tendrá un nombre, descripción, precio y stock.
Cuando queremos crear un CRUD de forma manual en Rails lo hacemos de la siguiente forma:
1. Generar el modelo y la migración:
En la terminal ejecutaremos el siguiente comando para generar el modelo de productos
rails generate model Product name:string description:string price:decimal stock:integer
Esto generará un archivo de migración en la carpeta db/migrate. Para aplicar la migración y crear la tabla de productos en la base de datos, ejecutamos:
rails db:migrate
2. Generar el controlador:
A continuación, vamos a generar el controlador para manejar las acciones relacionadas con los productos.
Ejecutando el siguiente comando en la terminal:
rails generate controller Products
3. Definir las acciones del controlador:
Abrimos el archivo app/controllers/products_controller.rb y agregamos las siguientes acciones:
#permite ver todos los productos
def index
@products = Product.all
end
#permite ver un producto en especifico y su detalle
def show
@product = Product.find(params[:id])
end
#permite ir a crear un nuevo producto
def new
@product = Product.new
end
#crea y persiste el nuevo producto
def create
@product= Product.create product_params
if @product.persisted?
redirect_to products_path, notice: "El producto ha sido creado de forma exitosa"
else
render :new, status: :unprocessable_entity
end
end
#permite ir a editar un producto
def edit
@product = Product.find(params[:id])
end
#actualiza y persiste el producto editado
def update
@product = Product.find(params[:id])
@product.update product_params
if @product.update product_params
redirect_to products_path, notice: "El producto ha sido actualizado de forma exitosa"
else
render :edit, status: :unprocessable_entity
end
end
#elimina un producto
def destroy
@product = Product.find(params[:id])
@product.destroy
redirect_to products_path,
status: :see_other, notice: "El producto ha sido eliminado de forma exitosa"
end
private
#En este caso estamos usando strong params
def product_params
params.require(:product).permit(:name, :description, :price, :stock)
end**
Si quieres saber más sobre strong params puedes revisar el siguiente artículo
4. Crear las vistas:
A continuación, necesitamos generar las vistas que se utilizarán para mostrar y manipular los productos.
Para esto crearemos los archivos correspondiente a new, show y edit de esta forma:
Siguiendo este ejemplo para la vista de new:
- En el archivo app/views/product
- new.html.erb (en caso que estemos usando erb)
5. Personalizar las vistas:
Ahora, abriremos los archivos donde personalizaremos el código según nuestras necesidades.
Para el index.
En app/views/productos/index.html.erb, podríamos tener algo como esto:
<h1>Lista de Productos</h1>
<ul>
<% @products.each do |product| %>
<li><%= product.name %> - <%= product.price %></li>
<% end %>
</ul>
Para new
<h1>Nuevo producto</h1>
<%= form_with model: @product do |form| %>
<div>
<%= form.label :name%><br>
<%= form.text_field :name%>
</div>
<div>
<%= form.label :desciption%><br>
<%= form.text_area :description %>
</div>
<div>
<%= form.label :price%><br>
<%= form.text_field :price%>
</div>
<div>
<%= form.label :stock%><br>
<%= form.text_field :stock %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
Edit puede usar el mismo formulario pero adaptando el título o usando un partial
Para ir a editar y eliminar el producto podriamos agregar los botones correspondientes en la vista show de esta forma:
<div>
<h2><%= @product.name%></p>
<h3><%= @product.description %></p>
<p><%= @product.price %></p>
<p><%= @product.stock %></p>
<%= link_to 'Edit this product', edit_product_path(@product) %>
<%= button_to 'Destroy this product', product_path(@product), method: :delete%>
</div>
6. Configurar las rutas:
Por último, necesitamos configurar las rutas, esto lo podemos hacer de forma manual o usando resources que ayudará a crear todas las rutas correspondientes al CRUD:
- En el archivo config/routes.rb
resources :products
Volviendo a scaffold
Todo lo que acabamos de hacer manualmente lo podemos hacer en un par de segundos con scaffold de la siguiente forma
rails generate scaffold Product name:string description:string price:decimal stock:integer
Con solo una simple línea de comando, generamos automáticamente el conjunto de controladores, modelos, vistas y rutas necesarios para administrar ese modelo en la base de datos.
Conclusión:
Aunque el método manual demora más, nos ayuda a comprender de forma profunda como es que funcionan todos los componentes de una aplicación. En cambio, con Scaffold podremos hacerlos de forma muy rápida y sencilla
La elección final de si usaremos Scaffold o no, dependerá de las preferencias y necesidades de cada desarrollador.
Gracias por leer este artículo, mucho éxito en tus proyectos!