A custom validation method is a user-defined method inside a Rails model that checks if an object meets specific rules beyond built-in validations. It helps ensure data is correct before saving.
Click to reveal answer
beginner
How do you tell Rails to use a custom validation method?
You use the validate :method_name syntax inside the model. Rails then calls that method during validation.
Click to reveal answer
beginner
What should a custom validation method do if the data is invalid?
It should add an error message to the model's errors collection using errors.add(:attribute, "message"). This prevents saving and shows the problem.
Click to reveal answer
intermediate
Why use custom validation methods instead of built-in validators?
Custom validations let you check complex or unique rules that built-in validators can't handle, like comparing two fields or checking external conditions.
Click to reveal answer
beginner
Example: How to write a custom validation method that ensures a user's age is at least 18?
Inside the User model, define a method like:
def adult_age
errors.add(:age, "must be at least 18") if age && age < 18
end
validate :adult_age
Click to reveal answer
Which keyword tells Rails to run a custom validation method?
Avalidates_with
Bvalidates
Cvalidate
Dvalidate_with
✗ Incorrect
Use validate :method_name to run a custom validation method.
Where do you add error messages inside a custom validation method?
Aadd_error(:attribute, "message")
Berrors.add(:attribute, "message")
Cerror.add(:attribute, "message")
Dadd.errors(:attribute, "message")
✗ Incorrect
The correct syntax is errors.add(:attribute, "message").
What happens if a custom validation adds an error to the model?
AThe model deletes itself
BThe model saves anyway
CThe error is ignored
DThe model will not save
✗ Incorrect
Adding errors prevents the model from saving until fixed.
Which of these is a reason to use a custom validation?
ATo check a rule built-in validators can't handle
BTo speed up saving records
CTo automatically fix errors
DTo skip validations
✗ Incorrect
Custom validations handle special rules not covered by built-in ones.
How do you call a custom validation method named check_name?
Avalidate :check_name
Bvalidates :check_name
Cvalidate_with :check_name
Dvalidates_with :check_name
✗ Incorrect
Use validate :check_name to run the method during validation.
Explain how to create and use a custom validation method in a Rails model.
Think about where to put the method and how Rails knows to run it.
You got /3 concepts.
Describe why and when you would choose a custom validation method over built-in validators.
Consider what built-in validators can't do.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of a custom validation method in a Rails model?
easy
A. To add your own rules for checking data before saving
B. To automatically generate database tables
C. To create user interface elements
D. To speed up database queries
Solution
Step 1: Understand validation role in Rails
Validations check data correctness before saving to the database.
Step 2: Identify custom validation purpose
Custom validations let you write your own rules beyond built-in checks.
Final Answer:
To add your own rules for checking data before saving -> Option A
Quick Check:
Custom validation = custom data rules [OK]
Hint: Custom validations add your own data rules [OK]
Common Mistakes:
Confusing validations with database setup
Thinking validations create UI elements
Assuming validations improve query speed
2. Which is the correct way to add a custom validation method named check_age in a Rails model?
easy
A. validates :check_age
B. validate :check_age
C. validate_check_age
D. validates_with :check_age
Solution
Step 1: Recall syntax for custom validations
Use validate :method_name to call a custom method.
Step 2: Match method name with syntax
For method check_age, syntax is validate :check_age.
Hint: Use 'validate :method_name' for custom validations [OK]
Common Mistakes:
Using 'validates' instead of 'validate' for custom methods
Adding underscores in method call
Using 'validates_with' incorrectly
3. Given this model code:
class User < ApplicationRecord
validate :check_name
def check_name
errors.add(:name, "can't be blank") if name.blank?
end
end
What happens if you try to save a User with name = ''?
medium
A. The save fails with an error on the name attribute
B. The save succeeds without errors
C. A syntax error occurs
D. The save fails but no error message is added
Solution
Step 1: Understand the custom validation logic
The method adds an error if name.blank? is true (empty string).
Step 2: Effect on saving a User with empty name
Since name is blank, error is added and save fails.
Final Answer:
The save fails with an error on the name attribute -> Option A
Quick Check:
Blank name triggers error = save fails [OK]
Hint: Blank fields trigger errors in custom validations [OK]
Common Mistakes:
Assuming save succeeds despite errors
Confusing blank? with nil check
Expecting syntax errors from valid code
4. Identify the error in this custom validation method:
class Product < ApplicationRecord
validate :check_price
def check_price
errors.add(:price, "must be positive") if price <= 0
end
end
medium
A. The method name should start with 'validate_'
B. The validation should use 'validates' instead of 'validate'
C. No error; the code is correct
D. The comparison operator should be '==' instead of '<='
Solution
Step 1: Check method naming and usage
Custom validation methods do not need 'validate_' prefix; 'validate :method' is correct.
Step 2: Verify validation logic and syntax
Using 'validate' with method and condition 'price <= 0' is valid Ruby and Rails syntax.
Final Answer:
No error; the code is correct -> Option C
Quick Check:
Custom validation syntax and logic are correct [OK]
Hint: Custom validation methods do not need special prefixes [OK]
Common Mistakes:
Adding 'validate_' prefix to method name
Using 'validates' for custom methods
Changing correct comparison operators
5. You want to create a custom validation that ensures a User's username is at least 5 characters and contains no spaces. Which code correctly implements this?
hard
A.
validate :username_rules
def username_rules
errors.add(:username, "invalid") if username.length <= 5 && username.include?(" ")
end
validate :username_rules
def username_rules
if username.length < 5 || username.include?(" ")
errors.add(:username, "must be 5+ chars and no spaces")
end
end
Solution
Step 1: Understand the validation requirements
Username must be at least 5 characters and contain no spaces.
Step 2: Analyze each option's logic
validate :username_rules
def username_rules
if username.length < 5 || username.include?(" ")
errors.add(:username, "must be 5+ chars and no spaces")
end
end
uses OR logic to add error if username is shorter than 5 or contains spaces, which matches requirements.
validate :username_rules
def username_rules
errors.add(:username, "invalid") if username.length <= 5 && username.include?(" ")
end
uses wrong comparison (<= 5 excludes 5).
Final Answer:
validate :username_rules
def username_rules
if username.length < 5 || username.include?(" ")
errors.add(:username, "must be 5+ chars and no spaces")
end
end -> Option D
Quick Check:
Custom validation logic matches requirements [OK]
Hint: Check logic carefully: use OR for combined invalid conditions [OK]
Common Mistakes:
Using AND instead of OR for combined conditions
Confusing built-in validations with custom methods