📖 Scenario: You are building a Rails app where users can register with their name and email. Instead of saving directly to the User model, you want to use a form object to handle validations and data processing cleanly.
🎯 Goal: Create a form object class that collects name and email, validates presence of both, and provides a save method to create a User record if valid.
📋 What You'll Learn
Create a form object class called RegistrationForm
Add name and email attributes to the form object
Validate presence of name and email in the form object
Implement a save method that creates a User if validations pass
💡 Why This Matters
🌍 Real World
Form objects help keep Rails controllers and models clean by handling complex form logic in one place.
💼 Career
Understanding form objects is useful for Rails developers to write maintainable and testable code in real applications.
Progress0 / 4 steps
1
Create the RegistrationForm class with attributes
Create a Ruby class called RegistrationForm that has attr_accessor for name and email.
Ruby on Rails
Hint
Use attr_accessor to create getter and setter methods for name and email.
2
Add validations for presence of name and email
Inside the RegistrationForm class, include ActiveModel::Model and add validations to require presence of name and email.
Ruby on Rails
Hint
Include ActiveModel::Model to get validation features, then use validates for presence checks.
3
Implement the save method to create a User
Add a save method to RegistrationForm that returns false if the form is invalid. If valid, it creates a new User with name and email and saves it.
Ruby on Rails
Hint
Use valid? to check validations, then create a User with the form data.
4
Use the RegistrationForm in a controller action
In a controller action, create a new RegistrationForm instance with name and email from params, call save, and handle success or failure accordingly.
Ruby on Rails
Hint
Instantiate the form with params, call save, then redirect or render based on result.
Practice
(1/5)
1. What is the main purpose of using a Form Object in Rails?
easy
A. To speed up database queries
B. To replace ActiveRecord models completely
C. To separate form validation and logic from database models
D. To generate HTML forms automatically
Solution
Step 1: Understand the role of form objects
Form objects are used to keep form-related logic and validations separate from the database models.
Step 2: Compare with other options
They do not replace ActiveRecord models or speed up queries, nor do they generate HTML forms automatically.
Final Answer:
To separate form validation and logic from database models -> Option C
Quick Check:
Form object purpose = Separation of form logic [OK]
Hint: Form objects separate form logic from models [OK]
Common Mistakes:
Thinking form objects replace database models
Assuming form objects speed up queries
Confusing form objects with view helpers
2. Which module is commonly included in a Rails form object to provide model-like behavior?
easy
A. ActiveModel::Model
B. ActiveRecord::Base
C. ActionController::Base
D. ActiveSupport::Concern
Solution
Step 1: Identify the module for model-like behavior without DB
The ActiveModel::Model module allows plain Ruby objects to behave like ActiveRecord models, including validations.
Step 2: Eliminate other options
ActiveRecord::Base is for database models, ActionController::Base is for controllers, and ActiveSupport::Concern is for mixins.
Final Answer:
ActiveModel::Model -> Option A
Quick Check:
Form object module = ActiveModel::Model [OK]
Hint: Form objects include ActiveModel::Model for validations [OK]
Common Mistakes:
Using ActiveRecord::Base in form objects
Confusing controller modules with model modules
Forgetting to include any module
3. Given this form object code, what will user_form.valid? return if email is blank?
class UserForm
include ActiveModel::Model
attr_accessor :email
validates :email, presence: true
end
user_form = UserForm.new(email: '')
user_form.valid?
medium
A. true
B. false
C. nil
D. Raises an error
Solution
Step 1: Check validation rules
The form object requires email to be present (not blank).
Step 2: Evaluate given input
The email is an empty string, which fails the presence validation, so valid? returns false.
Hint: Presence validation fails on blank string [OK]
Common Mistakes:
Assuming blank string passes presence validation
Expecting valid? to raise error on blank
Confusing nil and empty string behavior
4. Identify the error in this form object code:
class OrderForm
include ActiveModel::Model
attr_accessor :quantity
validates :quantity, numericality: { greater_than: 0 }
def save
if valid?
Order.create(quantity: quantity)
end
end
end
medium
A. Missing return value in save method
B. Order model is not defined
C. quantity is a string, needs conversion before validation
D. No error, code is correct
Solution
Step 1: Verify syntax and structure
The code properly includes ActiveModel::Model, defines attr_accessor, and sets up numericality validation. Syntax is valid.
Step 2: Confirm behavior
Numericality validation internally handles string-to-number conversion (e.g., '5' validates as > 0). The save method returns the Order instance (truthy) on success or nil/falsey otherwise, which works in conditionals.
Final Answer:
No error, code is correct -> Option D
Quick Check:
Numericality handles strings; save pattern acceptable [OK]
Thinking strings need manual conversion for numericality
Overthinking save method's return value
Assuming undefined models cause errors in examples
5. You want to create a form object that handles user registration with email, password, and password_confirmation. Which approach correctly ensures password confirmation validation and saves the user if valid?
class RegistrationForm
include ActiveModel::Model
attr_accessor :email, :password, :password_confirmation
validates :email, presence: true
validates :password, presence: true, confirmation: true
def save
if valid?
User.create(email: email, password: password)
end
end
end
hard
A. This code correctly validates and saves the user with password confirmation
B. Missing manual check for password_confirmation equality
C. Should use validates_confirmation_of :password_confirmation instead
D. Must call super in save method to save user
Solution
Step 1: Check validations for password confirmation
The confirmation: true option on password automatically validates that password_confirmation matches.
Step 2: Verify save method logic
The save method calls valid? and creates the user if valid, which is the correct pattern.
Final Answer:
This code correctly validates and saves the user with password confirmation -> Option A
Quick Check:
Password confirmation validation works with confirmation: true [OK]
Hint: Use confirmation: true for password confirmation validation [OK]
Common Mistakes:
Manually checking password_confirmation equality
Using deprecated validates_confirmation_of syntax
Forgetting to call valid? before save
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.