Recursos REST
REST es una forma particular de definir las rutas HTTP para hacer el CRUD de los modelos en nuestra aplicación Web.
A los modelos también se les conoce como recursos.
Por ejemplo, las rutas para hacer el CRUD de un modelo Product
serían las siguientes:
GET
/products
products#index
muestra la lista de productos
GET
/products/new
products#new
muestra el formulario para crear un producto
POST
/products
products#create
crea un nuevo producto
GET
/products/:id
products#show
muestra los detalles de un producto
GET
/products/:id/edit
products#edit
muestra el formulario para editar un producto
PATCH/PUT
/products/:id
products#update
actualiza un producto
DELETE
/products/:id
products#destroy
eliminar un producto
Definiendo las rutas de un recurso
Para definir las rutas de un recurso en config/routes.rb
se utiliza la palabra resources
:
La línea anterior es equivalente a las siguientes 8 rutas:
Para actualizar un recurso podemos utilizar el verbo PUT
o PATCH
.
Utilizando el generador de recursos
Así como desde la consola podemos generar un modelo y un controlador, existe un generador que nos permite crear un recurso, que genera el modelo y el controlador.
Por ejemplo, para generar el recurso de productos, es decir, el modelo Product
y el controlador ProductsController
utilizaríamos el siguiente comando:
Ese comando genera, entre otros, lo siguiente:
El modelo
Product
enapp/models/product.rb
La migración que se va a utilizar para crear la tabla.
El controlador en
app/controllers/products_controller.rb
El archivo
products.scss
enapp/assets/stylesheets/
.El archivo
products.coffee
enapp/assets/javascripts/
.La línea
resources :products
enconfig/routes.rb
.
No olvides correr la migración:
El controlador y las vistas de un recurso
El controlador de un recurso está compuesto de las siguientes acciones (métodos):
index
para mostrar la lista de registros.show
para mostrar los detalles de un registro.new
para mostrar el formulario de creación.create
para crear un registro.edit
para mostrar el formulario de edición.update
para actualizar un registro.destroy
para eliminar un registro.
Veamos cómo se implementaría cada una de estas acciones para un modelo Product
.
Listando registros
El método index
en el controlador ProductsController
quedaría de la siguiente forma:
Y la vista en app/views/products/index.html.erb
:
Mostrando los detalles de un registro
El método show
quedaría de la siguiente forma:
Y la vista en app/views/products/show.html.erb
quedaría de la siguiente forma:
Mostrando el formulario de creación
La creación de un registro se divide en dos: la ruta que muestra el formulario y la ruta que inserta el registro en la base de datos cuando alguien llena el formulario.
Para mostrar el formulario se utiliza el método new
que se implementaría de la siguiente forma:
Y la vista en app/views/products/new.html.erb
sería la siguiente:
Creando un registro
Para crear el registro necesitamos implementar el método create
y un método de ayuda product_params
:
La razón por la que tuvimos que crear ese método de ayuda es por un tema de seguridad. Ese método está filtrando la información que queremos que se pueda cambiar directamente. A esto se le conoce como strong parameters.
No necesitamos una vista para esta acción.
Mostrando el formulario de edición
Para mostrar el formulario de editar se utiliza el método edit
que se implementaría de la siguiente forma:
Y la vista en app/views/products/edit.html.erb
sería la siguiente:
El formulario de edición es igual al de creación, así que una buena práctica es moverlo a un partial _form.html.erb
.
Actualizando un registro
Para actualizar el registro necesitamos implementar el método update
y el método de ayuda product_params
que ya creamos previamente:
No necesitamos una vista para esta acción.
Eliminando un registro
Para eliminar un registro necesitamos implementar el método destroy
:
Limitando las acciones
Para limitar las rutas y acciones de un recurso utiliza la opción only
o except
de resources
en config/routes.rb
:
En este caso, para products sólo se generarían 3 rutas: la de listar, la de mostrar el formulario y la de crear.
Para resources se generarían todas excepto la de eliminar.
Notificaciones
Para mostrar notificaciones de éxito al crear, editar y eliminar registros utilizando el flash
.
Por ejemplo, para mostrar una notificación de éxito al eliminar un producto:
El notice
también se puede agregar directamente sobre el redirect_to
:
Mostrando las notificaciones
Puedes agregar el siguiente código donde quieres que aparezcan los mensajes de flash en el layout app/views/layouts/application.html.erb
:
Filtros
Puedes ejecutar métodos que se ejecutan antes o después de una acción de un controlador utilizando before_action
y after_action
.
Por ejemplo, podemos verificar si los usuarios ya están autenticados con un before_action
:
Si haces un render
o redirect_to
en un before_action
la acción no se ejecuta.
Los filtros son heredados, así que si defines el filtro en ApplicationController
se va a ejecutar en todos los controladores de la aplicación.
Limitando el alcance de los filtros
Puedes limitar las acciones a las que aplica un filtro utilizando las opciones only
o except
.
Por ejemplo:
Last updated