2. Which of the following is the correct way to add Devise authentication to a Rails model named User?
easy
A. Add before_action :authenticate_user! in the User model.
B. Add authenticate :user in the routes file.
C. Add has_secure_password in the User controller.
D. Add devise :database_authenticatable, :registerable inside the User model.
Solution
Step 1: Identify how Devise is used in models
Devise requires adding devise with modules inside the model class to enable authentication features.
Step 2: Check each option's correctness
Add devise :database_authenticatable, :registerable inside the User model correctly shows adding devise :database_authenticatable, :registerable inside the User model. Other options misuse syntax or place code in wrong files.
Final Answer:
Add devise :database_authenticatable, :registerable inside the User model. -> Option D
Quick Check:
Devise modules go inside model class [OK]
Hint: Devise modules go inside model class, not routes or controller [OK]
Common Mistakes:
Placing authentication code in routes or controllers incorrectly
Using has_secure_password instead of Devise syntax
Calling authenticate_user! in model instead of controller
3. Given this Rails controller code using Devise:
class DashboardController < ApplicationController
before_action :authenticate_user!
def index
render plain: "Welcome, #{current_user.email}!"
end
end
What will happen if an unauthenticated user tries to access /dashboard?
medium
A. They will be redirected to the sign-in page.
B. They will see the welcome message with their email.
This method checks if a user is signed in; if not, it redirects to the sign-in page.
Step 2: Predict the controller response for unauthenticated user
Since the user is not signed in, the controller will redirect them to the login page instead of showing the welcome message.
Final Answer:
They will be redirected to the sign-in page. -> Option A
Quick Check:
Unauthenticated user = redirect to sign-in [OK]
Hint: authenticate_user! redirects unauthenticated users to login [OK]
Common Mistakes:
Assuming unauthenticated users see content
Thinking it returns 404 error
Expecting a blank page instead of redirect
4. You added before_action :authenticate_user! in your Rails controller, but unauthenticated users can still access protected pages. What is the most likely cause?
medium
A. You did not add devise_for :users in routes.rb.
B. You placed before_action after the action methods.
C. You did not restart the Rails server after adding authentication.
D. You forgot to include Devise in your Gemfile.
Solution
Step 1: Check the role of devise_for :users in routes
This line sets up all necessary routes for Devise authentication, including sign-in and sign-out paths.
Step 2: Understand impact of missing routes
If devise_for :users is missing, authentication paths do not exist, so authenticate_user! cannot redirect unauthenticated users properly.
Final Answer:
You did not add devise_for :users in routes.rb. -> Option A
Quick Check:
Missing devise routes = no authentication redirects [OK]
Hint: Devise needs routes set with devise_for :users [OK]
Common Mistakes:
Assuming server restart fixes missing routes
Placing before_action incorrectly does not bypass it
Forgetting to add Devise gem causes errors, not silent failure
5. You want to secure an API endpoint in Rails so only authenticated users can access it. You use Devise and add before_action :authenticate_user! in your API controller. However, API clients get redirected to the sign-in page instead of receiving an error. How can you fix this to return a 401 Unauthorized status instead?
hard
A. Add skip_before_action :authenticate_user! in the API controller.
B. Override Devise's authenticate_user! to respond with JSON and 401 status for API requests.
C. Remove before_action :authenticate_user! and check authentication manually.
D. Change the API controller to inherit from ApplicationController instead of ActionController::API.
Solution
Step 1: Understand default Devise behavior for unauthenticated users
Devise redirects unauthenticated users to sign-in page by default, which is not suitable for APIs.
Step 2: Customize authentication failure response for API
Override the failure response to return JSON with 401 Unauthorized status when API requests fail authentication.
Final Answer:
Override Devise's authenticate_user! to respond with JSON and 401 status for API requests. -> Option B
Quick Check:
API auth failure = JSON 401, not redirect [OK]
Hint: API needs JSON 401 response, not redirect [OK]
Common Mistakes:
Removing authentication check loses security
Skipping before_action disables protection
Changing controller inheritance does not fix response format
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.