Le validazioni vivono nel Model e bloccano il salvataggio se i dati non rispettano le regole. Sono la garanzia che nel database non finisca spazzatura.
class Launch < ApplicationRecord
validates :name, presence: true
validates :name, uniqueness: true
validates :provider, presence: true
validates :status, inclusion: { in: %w[scheduled success failure] }
end
launch = Launch.new
launch.save # => false
launch.errors.full_messages # => ["Name can't be blank", ...]
launch.save! # solleva un'eccezione invece di restituire false
save restituisce false se una validazione fallisce; save! solleva un'eccezione. In errors trovi i messaggi da mostrare all'utente.
Attenzione: le validazioni proteggono a livello applicativo. Per garanzie ferree (unicità sotto concorrenza) aggiungi anche un indice unico nel database.