โœ…

Validations

Ensure data integrity at the Model level

Validation checks data validity before it gets saved to the DB.

class Post < ApplicationRecord
  validates :title, presence: true, length: { maximum: 200 }
  validates :content, presence: true
  validates :slug, uniqueness: true
  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
  validates :status, inclusion: { in: %w[draft published archived] }
  validate :custom_validation_method

  private

  def custom_validation_method
    if publish_date.present? && publish_date < Date.today
      errors.add(:publish_date, 'cannot be in the past')
    end
  end
end

On validation failure:

  • save โ†’ returns false

  • save! โ†’ raises ActiveRecord::RecordInvalid

  • model.errors.full_messages to access error messages

  • In views, @post.errors[:title] for per-field errors

Key Points

1

Declare validation rules with validates :field, options

2

presence: true โ€” blank values not allowed

3

uniqueness: true โ€” no duplicates (DB index recommended)

4

length: { minimum: 1, maximum: 200 } โ€” length constraints

5

Validations auto-run on save/create

6

On failure, error messages stored in errors object

Pros

  • Validation at application level, not DB level
  • Automatic error message management
  • Custom validation methods possible
  • Conditional validation support (if:/unless:)

Cons

  • uniqueness has race conditions โ†’ DB unique index needed
  • Complex business rules should be in Service Objects
  • Can be bypassed with skip_validation
  • May need i18n configuration

Use Cases

Required field check (presence) Email format validation (format) Duplicate prevention (uniqueness) Value range validation (inclusion, numericality)