A route constraint is a rule that limits which requests match a route. It helps control routing by checking conditions like request parameters, formats, or custom logic before choosing a route.
Click to reveal answer
beginner
How do you apply a simple format constraint to a route in Rails?
You add constraints: { format: 'json' } to the route. This means the route only matches requests asking for JSON format.
Click to reveal answer
intermediate
What is the purpose of a custom constraint class in Rails routing?
A custom constraint class lets you write Ruby code to decide if a route matches. It must have a <code>matches?</code> method that returns true or false based on the request.
Click to reveal answer
intermediate
Example: How to restrict a route to only match if a user is an admin using a constraint?
Create a class like <code>AdminConstraint</code> with a <code>matches?</code> method checking if <code>request.session[:user_role] == 'admin'</code>. Then use <code>constraints AdminConstraint.new do ... end</code> around the route.
Click to reveal answer
beginner
What happens if a route constraint returns false for a request?
Rails skips that route and tries the next one. If no routes match, it returns a 404 Not Found error.
Click to reveal answer
Which of these is a valid way to add a format constraint to a Rails route?
Aget '/posts', to: 'posts#index', match: 'json'
Bget '/posts', to: 'posts#index', format: 'json'
Cget '/posts', to: 'posts#index', constraints: { format: 'json' }
Dget '/posts', to: 'posts#index', only: 'json'
✗ Incorrect
Option C correctly uses the constraints hash to limit the route to JSON format.
What method must a custom constraint class implement in Rails?
Acall
Bmatches?
Ccheck
Dvalidate
✗ Incorrect
The custom constraint class must implement the matches? method that returns true or false.
If a route constraint returns false, what does Rails do?
ARaises an error
BRedirects to the homepage
CStops routing and returns 500
DSkips the route and tries the next one
✗ Incorrect
Rails skips the route and tries the next matching route if the constraint returns false.
Which of these can be used as a route constraint in Rails?
AAll of the above
BA custom class with matches? method
CA regular expression
DA hash with key-value pairs
✗ Incorrect
Rails supports regex, custom classes, and hashes as route constraints.
Why use route constraints in a Rails app?
ATo restrict routes based on request details
BTo improve route matching speed
CTo style routes with CSS
DTo generate database queries
✗ Incorrect
Route constraints restrict which requests match a route based on conditions like format or user role.
Explain how to create and use a custom route constraint in Rails.
Think about how to check request details before routing.
You got /4 concepts.
Describe what happens when a route constraint does not match a request.
Consider the routing process flow.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of using route constraints in a Rails application?
easy
A. To style the HTML output of views
B. To speed up database queries automatically
C. To manage user sessions and cookies
D. To limit which URLs match routes based on specific patterns or conditions
Solution
Step 1: Understand what route constraints do
Route constraints restrict which URLs can match a route by applying conditions like regex or subdomain checks.
Step 2: Compare options to the purpose of constraints
Only To limit which URLs match routes based on specific patterns or conditions describes limiting URL matches based on patterns or conditions, which is the core use of route constraints.
Final Answer:
To limit which URLs match routes based on specific patterns or conditions -> Option D
Quick Check:
Route constraints = limit URL matches [OK]
Hint: Route constraints control which URLs reach your routes [OK]
Common Mistakes:
Confusing route constraints with database or view logic
Thinking constraints manage sessions or cookies
Assuming constraints style HTML output
2. Which of the following is the correct syntax to add a regex constraint for a route parameter :id that only allows digits?
easy
A. get '/items/:id', to: 'items#show', constraints: { id: /\d+/ }
B. get '/items/:id', to: 'items#show', constraints: { id: '[a-z]+' }
C. get '/items/:id', to: 'items#show', constraints: { id: /[a-z]+/ }
D. get '/items/:id', to: 'items#show', constraints: { id: /\w+/ }
Solution
Step 1: Identify regex for digits only
The regex /\d+/ matches one or more digits, which fits the requirement.
Step 2: Check syntax for constraints hash
The syntax constraints: { id: /\d+/ } correctly applies the regex constraint to the :id parameter.
Final Answer:
get '/items/:id', to: 'items#show', constraints: { id: /\d+/ } -> Option A
Quick Check:
Regex for digits = /\d+/ [OK]
Hint: Use /\d+/ regex for digit-only route params [OK]
Common Mistakes:
Using string instead of regex for constraints
Using wrong regex like /[a-z]+/ for digits
Missing double backslash escape in regex
3. Given the route definition below, what URL will match the route?
get '/profile/:username', to: 'users#show', constraints: { username: /[a-z]{3,}/ }
medium
A. /profile/alex
B. /profile/Jo
C. /profile/123
D. /profile/Alice
Solution
Step 1: Understand the regex constraint
The regex /[a-z]{3,}/ means the username must be at least 3 lowercase letters.
Step 2: Check each URL against the regex
"/profile/Jo" fails because "Jo" has uppercase and only 2 letters. "/profile/alex" matches because "alex" is lowercase and 4 letters. "/profile/123" fails because digits are not allowed. "/profile/Alice" fails because of uppercase 'A'.
Hint: Match regex carefully: lowercase letters only, length matters [OK]
Common Mistakes:
Ignoring case sensitivity in regex
Assuming digits match letter regex
Not counting minimum length in regex
4. Identify the error in this route constraint code snippet:
get '/orders/:order_id', to: 'orders#show', constraints: { order_id: '\\d+' }
medium
A. The route path is missing a leading slash
B. The controller action is incorrect
C. The regex is a string, it should be a Regexp object
D. The constraints hash key should be a symbol, not a string
Solution
Step 1: Check the constraints value type
The value '\\d+' is a string, but Rails expects a Regexp object for regex constraints.
Step 2: Confirm correct regex syntax
It should be /\d+/ (a Regexp literal), not a string '\\d+'.
Final Answer:
The regex is a string, it should be a Regexp object -> Option C
Quick Check:
Regex constraints need Regexp objects, not strings [OK]
Hint: Use /regex/ not 'string' for route constraints [OK]
Common Mistakes:
Using string instead of Regexp for constraints
Confusing route path syntax
Misnaming controller or action
5. You want to restrict a route to only respond when the subdomain is 'admin'. Which of the following route definitions correctly applies this constraint?
hard
A. get '/dashboard', to: 'admin#dashboard', constraints: { subdomain: 'admin' }
B. get '/dashboard', to: 'admin#dashboard', constraints: lambda { |req| req.subdomain == 'admin' }
C. get '/dashboard', to: 'admin#dashboard', constraints: { domain: 'admin' }
D. get '/dashboard', to: 'admin#dashboard', constraints: { subdomain: /admin/ }
Solution
Step 1: Understand subdomain constraints options
Rails allows constraints as regex, hash, or custom objects like lambdas for complex logic.
Step 2: Evaluate each option
get '/dashboard', to: 'admin#dashboard', constraints: { subdomain: 'admin' } uses a string for subdomain, which is not valid. get '/dashboard', to: 'admin#dashboard', constraints: { subdomain: /admin/ } uses regex /admin/, which matches subdomain 'admin' but may match partials. get '/dashboard', to: 'admin#dashboard', constraints: lambda { |req| req.subdomain == 'admin' } uses a lambda checking if request subdomain equals 'admin', which is precise and recommended. get '/dashboard', to: 'admin#dashboard', constraints: { domain: 'admin' } uses 'domain' key, which is incorrect for subdomain constraints.
Final Answer:
get '/dashboard', to: 'admin#dashboard', constraints: lambda { |req| req.subdomain == 'admin' } -> Option B
Quick Check:
Use lambda for precise subdomain check [OK]
Hint: Use lambda for exact subdomain constraints [OK]
Common Mistakes:
Using string instead of lambda or regex for subdomain
Confusing domain with subdomain key
Using regex that matches partial subdomains unintentionally
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.