Se pueden realizar acciones «programadas» antes o después de cualquier acción en el controlador de la vista o del modelo.
Controladores
Se puede poner acciones que se realicen antes o después de una, varias o todas las acciones. Los posibles caso serian:
- before_action ( antes de que realices la acción que pides…)
- after_action ( después de que realices la acción que pides…)
Y se podrían combinar con:
- except (excepto cuando llames a los métodos…)
- only (solo cuando llames a los métodos…)
En este ejemplo antes de cada acción del controlador excepto la de index y la de new, se ejecutará la acción declarada privada set_article:
class ArticlesController < ApplicationController before_action :set_article, except:[:index, :new] def index ... end def new ... end def create ... end def update ... end . . . private def set_article @article = Article.find(params[:id]) end end
Modelos
Ejecutar una acción antes de que ciertas acciones pasen en el modelo:
- before_save ( antes de guardar un registro en la base de datos…)
- after_save ( después de guardar un registro en la base de datos…)
- before_create ( antes de crear un registro en la base de datos…)
- after_create ( después de crear un registro en la base de datos…)
- before_validation (antes de validar un registro)
- ….
Ejemplo:
En este ejemplo antes de la creación de cada articulo en la bbdd, inicializa el atributo total_quantity a 0.
**Como extra, en la vista llama a una acción del modelo para sumar una visita cada vez que se muestra el articulo.
Articles Controller
class ArticlesController < ApplicationController . . . def show @article.update_visits_count end . .
Articles Model
class Article < ApplicationRecord . . . before_save :guardar before_create :crear before_create :set_total_quantity . . . def update_visits_count self.update(visits_count: self.visits_count + 1) end private def guardar puts "------------------Voy a Guardar!!!!" end def crear puts "------------------Voy a Crear un Nuevo Registro!!!!" end def set_total_quantity self.total_quantity = 0 end