DEV Community

Davide Santangelo
Davide Santangelo

Posted on

Rails Model Validation: A Comprehensive Guide with Code Examples

Ruby on Rails provides a variety of built-in validation methods that help ensure that data stored in your database is consistent and meets certain criteria. These validations can be specified directly in your model files, making them easy to manage and maintain.

Here are some of the most common validation methods available in Rails:

Presence Validation

The simplest type of validation is the presence validation, which ensures that a particular field is not empty. For example, if you want to ensure that the name field of a User model is always present, you would write the following code:

class User < ApplicationRecord
  validates :name, presence: true
end
Enter fullscreen mode Exit fullscreen mode

Length Validation

Another common type of validation is the length validation, which restricts the length of a string field. For example, if you want to ensure that the password field of a User model is at least 8 characters long, you would write the following code:

class User < ApplicationRecord
  validates :password, length: { minimum: 8 }
end
Enter fullscreen mode Exit fullscreen mode

You can also specify a maximum length for a field, or both a minimum and a maximum length:

class User < ApplicationRecord
  validates :password, length: { minimum: 8, maximum: 20 }
end
Enter fullscreen mode Exit fullscreen mode

Format Validation

Format validation is used to ensure that a field matches a certain pattern, such as a specific email format or a zip code format. For example, if you want to ensure that the email field of a User model is in the proper format, you would write the following code:

class User < ApplicationRecord
  validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
end
Enter fullscreen mode Exit fullscreen mode

Uniqueness Validation

Uniqueness validation ensures that a particular field is unique across all records in the database. For example, if you want to ensure that the email field of a User model is unique, you would write the following code:

class User < ApplicationRecord
  validates :email, uniqueness: true
end
Enter fullscreen mode Exit fullscreen mode

Numericality Validation

Numericality validation ensures that a particular field is a number. You can also specify additional constraints, such as ensuring that the number is greater than or equal to a certain value, or that it is an integer. For example, if you want to ensure that the age field of a User model is a number greater than or equal to 18, you would write the following code:

class User < ApplicationRecord
  validates :age, numericality: { greater_than_or_equal_to: 18 }
end
Enter fullscreen mode Exit fullscreen mode

Confirmation Validation

Confirmation validation ensures that a field is confirmed by a second field. For example, if you want to ensure that a user has confirmed their password by entering it twice, you would write the following code:

class User < ApplicationRecord
  validates :password, confirmation: true
end
Enter fullscreen mode Exit fullscreen mode

In the view, you would have two fields, one for the password and one for the confirmation, and the confirmation field would be named password_confirmation.

Inclusion Validation

Inclusion validation is used to ensure that a field is included in a specific set of values. For example, if you want to ensure that a User model has a role field that is either admin, moderator, or member, you would write the following code:

class User < ApplicationRecord
  validates :role, inclusion: { in: %w(admin moderator member) }
end
Enter fullscreen mode Exit fullscreen mode

Exclusion Validation

Exclusion validation is used to ensure that a field is not included in a specific set of values. For example, if you want to ensure that a User model does not have a role field that is admin or root, you would write the following code:

class User < ApplicationRecord
  validates :role, exclusion: { in: %w(admin root) }
end
Enter fullscreen mode Exit fullscreen mode

Custom Message Validation

You can also specify custom error messages for each validation. For example, if you want to display a custom error message when a User model's email is not in the proper format, you would write the following code:

class User < ApplicationRecord
  validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, 
    message: "is not a valid email address" }
end
Enter fullscreen mode Exit fullscreen mode

Conditional Validation

Conditional validation allows you to specify that a validation should only occur if a certain condition is met. You can specify the condition using the if option. For example, if you want to ensure that a User model's password is at least 8 characters long only if the password field is not nil, you could write the following code:

class User < ApplicationRecord
  validates :password, length: { minimum: 8 }, if: :password_not_nil

  private
    def password_not_nil
      password.present?
    end
end
Enter fullscreen mode Exit fullscreen mode

Multiple Validations

You can use multiple validations on a single field by chaining validations together. For example, if you want to ensure that a User model's email is present, is in the proper format, and is unique, you could write the following code:

class User < ApplicationRecord
  validates :email, presence: true, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i }, uniqueness: true
end
Enter fullscreen mode Exit fullscreen mode

Custom Validation

In addition to the built-in validation methods, Rails also allows you to create custom validations. For example, if you want to ensure that a User model has a unique combination of a first and last name, you could write a custom validation method:

class User < ApplicationRecord
  validate :unique_name

  def unique_name
    if User.exists?(first_name: first_name, last_name: last_name)
      errors.add(:first_name, "and last name have already been taken")
    end
  end
end
Enter fullscreen mode Exit fullscreen mode

or if you want to ensure that the name of a User model is always capitalized, you could write the following code:

class User < ApplicationRecord
  validate :name_must_be_capitalized

  private
    def name_must_be_capitalized
      errors.add(:name, "must be capitalized") unless name.nil? || name == name.capitalize
    end
end
Enter fullscreen mode Exit fullscreen mode

Association Validation

In addition to validating individual models, you can also validate associations between models. Association validation allows you to specify validations for a model that depends on the state of other models.

For example, if a User model has many Posts, you could validate that a User must have at least one post before it can be saved to the database. You would write the following code:

class User < ApplicationRecord
  has_many :posts
  validates_associated :posts
end

class Post < ApplicationRecord
  belongs_to :user
  validates :title, presence: true
end
Enter fullscreen mode Exit fullscreen mode

In this example, a User will not be saved to the database unless it has at least one associated Post with a title.

Conclusion

In conclusion, validations are an important part of any Rails application. By using validations, you can ensure that your data is always accurate, consistent, and meets the criteria you specify.

Whether you're validating individual models or associations between models, Rails makes it easy to specify and enforce your validation rules. With the power of Rails validations, you can make your application more robust and reliable, ensuring that the data entered by your users is always accurate and consistent.

For more information and a complete guide on Rails validations, visit the official Ruby on Rails documentation at https://guides.rubyonrails.org/active_record_validations.html.

Top comments (0)