Callbacks en Ruby on Rails

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

 

Documentación