Davide Santangelo
Posted on February 2, 2023
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
Posted on February 2, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.