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
