Entendiendo un controlador en Ruby on Rails
Los controladores son una parte esencial de una aplicación de Ruby on Rails, sin ir más allá el patrón base del framework es MVC (Modelo, Vista Controlador). El controlador es el encargado de hacerse cargo de la solicitud que recibe la aplicación de parte del user-agent (el usuario). Para eso se apoya del Modelo y de las Vistas.
Veamos un controlador de ejemplo con las 7 acciones comunes necesarias para soportar CRUD de un recurso. Para términos del ejemplo vamos a hacer el controlador de libros, que permite crear, ver, actualizar y eliminar (CRUD) libros.
1. Dónde está el controlador?
Partamos por la ubicación y la estructura
Veamos un controlador de ejemplo con las 7 acciones comunes necesarias para soportar CRUD de un recurso. Para términos del ejemplo vamos a hacer el controlador de libros, que permite crear, ver, actualizar y eliminar (CRUD) libros.
1. Dónde está el controlador?
Partamos por la ubicación y la estructura
# app/controllers/books_controller.rb class BooksController < ApplicationController end
Los controladores se encuentran en la carpeta app/controllers y llevan el nombre del recurso en plural. Podemos apreciar que el controlador hereda de la clase ApplicationController, esto nos permite compartir comportamientos entre todos los controladores de la aplicación mediante herencia.
2. Acciones para crear un nuevo elemento
Para crear elementos (en este caso libros) nuevos, el controlador necesita 2 acciones (métodos):
# app/controllers/books_controller.rb
class BooksController < ApplicationController
def new
@book = Book.new
end
def create
book = Book.new book_params
if book.save
redirect_to book
else
render :new
end
end
private
def book_params
params.require(:book).permit(:title, :author)
end
endPodemos ver que tenemos dos acciones principales new y create. La primera se encarga de crear un libro en memoria con todos sus campos vacíos para que la vista cree un formulario que permita al usuario completar esos campos. Por otro lado, cuando el usuario completa el formulario y presionar enviar esos datos son recibidos por la acción create, que se encarga de instanciar el libro en memoria y luego mediante book.save trata de almacenarlo en la base de datos. Dicha función retorna true si logró guardar el libro y false en caso contrario, con eso podemos tomar la decisión de qué hacer en cada caso. La convención más tradicional es mostrar nuevamente el formulario junto con el detalle de los errores que hubo si no logró almacenarse, y si fue exitoso llevar al usuario a la vista del libro.
3. Acciones para mostrar elementos existentes
Para mostrar los elementos existentes tenemos 2 acciones
# app/controllers/books_controller.rb
class BooksController < ApplicationController
def index
@books = Book.all
end
def show
@book = Book.find params[:id]
end
endLa primera acción, index, lo que hace es cargar todos los libros que tenemos en la base de datos (suele cambiarse eso por todos los que tenga permiso el usuario para ver) y la acción show nos permite ver un libro en particular en base al id del libro que viene en la url a la que estamos accediendo (y que obtenemos en la variable params[:id])
4. Acciones para actualizar un elemento
Para actualizar un elemento existente necesitamos 2 acciones (al igual que para la creación): uno para mostrar el formulario al usuario con los datos actuales del elemento, y otra para ejecutar la actualización en la base de datos del elemento con los datos enviados por el usuario en el formulario.
# app/controllers/books_controller.rb
class BooksController < ApplicationController
def edit
@book = Book.find params[:id]
end
def update
book = Book.new book_params
if book.update
redirect_to book
else
render :edit
end
end
private
def book_params
params.require(:book).permit(:title, :author)
end
endLa lógica de ambas acciones es exactamente la misma que en la creación. La única diferencia es que en el update, en lugar de ejecutar un save ejecuta update, pero el resultado es el mismo: retorna true o false dependiendo si logra almacenar los cambios en la base de datos.
5. Acción para eliminar un elemento
La última de las acciones para obtener el CRUD completo es la eliminación. Para esto en el controlador tenemos la siguiente acción:
5. Acción para eliminar un elemento
La última de las acciones para obtener el CRUD completo es la eliminación. Para esto en el controlador tenemos la siguiente acción:
# app/controllers/books_controller.rb
class BooksController < ApplicationController
def destroy
book = Book.find params[:id]
book.destroy
redirect_to books_path
end
endEsta acción lo que hace es buscar el libro en base al id que recibe en la url a través de la variable params y luego lo elimina, para finalmente llevar al usuario al index de libros (donde ya no debería aparecer el libro eliminado).
El controlador que vimos aquí es uno básico en base a las convenciones de Ruby on Rails, obviamente puede ser modificado mucho en base a los distintos casos de uso que tengamos.
A continuación dejo el código completo del controlador:
El controlador que vimos aquí es uno básico en base a las convenciones de Ruby on Rails, obviamente puede ser modificado mucho en base a los distintos casos de uso que tengamos.
A continuación dejo el código completo del controlador:
# app/controllers/books_controller.rb
class BooksController < ApplicationController
def index
@books = Book.all
end
def new
@book = Book.new
end
def show
@book = Book.find params[:id]
end
def edit
@book = Book.find params[:id]
end
def update
book = Book.find params[:id]
if book.update
redirect_to book
else
render :edit
end
end
def create
book = Book.new books_params
if book.save
redirect_to book
else
render :new
end
end
def destroy
book = Book.find params[:id]
book.destroy
redirect_to books_path
end
private
def books_params
params.require(:book).permit(:title, ...)
end
end