No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Agregando validaciones al modelo

22/36
Recursos

Aportes 10

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

A mi me funcionó

uniqueness: { case_sensitive: false }

En la versión 7 de Rails, al crear el scaffold no funciona el botón Destroy, creo que es por la implementación de turbo-rails, así que para hacer que funcione el botón Destroy debemos de cambiar el código de los botones, de esto:

%td= link_to 'Destroy', category, method => :delete, :data => { :confirm => 'Are you sure?' }

a esto:

%td= link_to 'Destroy', category, :data => { turbo_method: :delete, :confirm => 'Are you sure?' }

y lo mismo con el botón Destroy de Tasks

Para quien le interese saber más del tema de validaciones, les dejo este excelente artículo de las guías oficiales de Ruby on Rails.
Y si necesitan documentos de referencia, les dejo el siguiente link:
https://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html

Para quienes no les funcione al hacer click en destroy (redirecciona al registro), pueden intentar lo siquiente:

Dentro de la vista de category, en index:

%td= link_to 'Destroy', category, :data => { :turbo_method => :delete, :turbo_confirm => 'Are you sure?' }

Y aplicando la siguiente configuración en el archivo application.html.erb dentro de la etiqueta **head **

RUTA: /app/views/layouts/application.html.erb

<%= javascript_include_tag "turbo", type: "module" %>

Para evitar la creación de registros en blanco, o para agregar validaciones que se requieran para cumplir las reglas del negocio se pueden agregar validaciones a los campos para que lancen un error sí estas no se cumplen.

Validaciones

Las validaciones se agregan en el model que será validado, empezando con la palabra validates seguido de los atributos que se quiere validar. Seguido de esto se pueden usar helpers que Rails provee para validar diferentes cosas. Por ejemplo, el helper presence para validar que el campo no esté vacío.

class Category < ApplicationRecord
    has_many :tasks

    validates :name, :description, presence: true
    validates :name, uniqueness: { case_insensitive: false }
end

Existen otros helpers para validar diferentes aspectos y diferentes elementos HTML. Documentación: https://guides.rubyonrails.org/active_record_validations.html#validation-helpers

Validación personalizada

Para validar un atributo de forma personalizada se usa la palabra validate, seguido del nombre de la función que validará el campo. La función debe ser declarada dentro de la clase.

validate :due_date_validity

def due_date_validity   
  return if due_date.blank?
  return if due_date > Date.today
  errors.add(:due_date, I18n.t('task.errors.invalid_due_date'))
end

En este caso se valida que la fecha de vencimiento no esté vacía y además que la fecha no sea anterior al día actual, si no se cumplen las validaciones se agrega un error con el método errors.add.

En caso de que no quieran utlizar la internalización pueden declarar su error asi:

def due_date_validity
    return if due_date.blank?
      return if due_date > Date.today
        errors.add(:due_date, "Date can't be in the past")
  end

Cuál es la diferencia de colocar uniqueness de la siguiente manera…

:uniqueness => true

@JohanTique

Excelente, estoy muy contento con este curso, muy buenas explicaciones.

En el punto de case_insensitive la validación se cumple, pero esto sucede porque no borro el registro que tenía por nombre Test, por lo tanto cuando hace la validación lo hace entre Test y Test, y no entre test y Test.

Excelente la explicación me queda muy claró cómo realizar validaciones, estoy tratando de implementarlas en una api y rescatarlas para presentarlas en un front ssr.