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:
resources :productsLa línea anterior es equivalente a las siguientes 8 rutas:
get "/products", to: "products#index"
get "/products/new", to: "products#new"
post "/products", to: "products#create"
get "/products/:id", to: "products#show"
get "/products/:id/edit", to: "products#edit"
put "/products/:id", to: "products#update"
patch "/products/:id", to: "products#update"
delete "/products/:id", to: "products#destroy"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
Productenapp/models/product.rbLa migración que se va a utilizar para crear la tabla.
El controlador en
app/controllers/products_controller.rbEl archivo
products.scssenapp/assets/stylesheets/.El archivo
products.coffeeenapp/assets/javascripts/.La línea
resources :productsenconfig/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):
indexpara mostrar la lista de registros.showpara mostrar los detalles de un registro.newpara mostrar el formulario de creación.createpara crear un registro.editpara mostrar el formulario de edición.updatepara actualizar un registro.destroypara 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