Login and logout let users enter and leave your app safely. It keeps their info private and controls access.
When you want users to have personal accounts.
When you need to protect parts of your app from strangers.
When you want to remember who is using the app.
When you want to let users end their session securely.
Syntax
Ruby on Rails
class SessionsController < ApplicationController
def new
# shows login form
end
def create
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
session[:user_id] = user.id
redirect_to root_path, notice: 'Logged in!'else
flash.now[:alert] = 'Invalid email or password'
render :new
end
end
def destroy
session[:user_id] = nil
redirect_to login_path, notice: 'Logged out!'
end
end
The session hash stores user info between requests.
authenticate checks the password securely.
Examples
This saves the logged-in user's ID in the session to remember them.
Ruby on Rails
session[:user_id] = user.id
This clears the session to log the user out.
Ruby on Rails
session[:user_id] = nil
This finds the user by email and checks the password.
Ruby on Rails
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
# login successelse# login fail
end
Sample Program
This code shows a simple login form, a controller to handle login and logout, and routes to connect URLs.
Ruby on Rails
# app/controllers/sessions_controller.rbclass SessionsController < ApplicationController
def new
# renders login form
end
def create
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
session[:user_id] = user.id
redirect_to root_path, notice: 'Logged in!'else
flash.now[:alert] = 'Invalid email or password'
render :new
end
end
def destroy
session[:user_id] = nil
redirect_to login_path, notice: 'Logged out!'
end
end
# app/views/sessions/new.html.erb
<%= form_with url: login_path, method: :post do %>
<div>
<label for="email">Email:</label>
<%= text_field_tag :email, nil, id: 'email', required: true %>
</div>
<div>
<label for="password">Password:</label>
<%= password_field_tag :password, nil, id: 'password', required: true %>
</div>
<div>
<%= submit_tag 'Log in' %>
</div>
<% end %>
# config/routes.rb
Rails.application.routes.draw do
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
root 'welcome#index'
end
OutputSuccess
Important Notes
Always use has_secure_password in your User model to handle password safely.
Use flash messages to show login success or failure clearly.
Protect pages by checking if session[:user_id] exists before allowing access.
Summary
Login saves user ID in session to remember them.
Logout clears session to end user access.
Use controller actions to handle login form, authentication, and logout.
Practice
(1/5)
1. What does the session[:user_id] typically store in a Rails login flow?
easy
A. The user's email address
B. The ID of the logged-in user
C. The user's password
D. The current time of login
Solution
Step 1: Understand session usage in Rails login
In Rails, session[:user_id] is used to store the unique identifier of the logged-in user to keep track of their session.
Step 2: Differentiate from other user data
Passwords and emails are not stored in session for security and privacy reasons; only the user ID is stored.
Final Answer:
The ID of the logged-in user -> Option B
Quick Check:
session[:user_id] = user ID [OK]
Hint: Session stores user ID, not password or email [OK]
Common Mistakes:
Thinking session stores password
Confusing session with cookies
Assuming session stores full user object
2. Which of the following is the correct way to clear the user session during logout in a Rails controller?
easy
A. reset_session
B. session.clear
C. session[:user_id] = nil
D. session.delete(:user_id)
Solution
Step 1: Identify Rails method to reset session
The reset_session method clears the entire session safely and is the recommended way to log out a user.
Step 2: Compare with other options
While session.delete(:user_id) or setting it to nil removes the user ID, reset_session is more secure as it resets the whole session.
Final Answer:
reset_session -> Option A
Quick Check:
Use reset_session to clear all session data [OK]
Hint: Use reset_session to fully clear session on logout [OK]
Common Mistakes:
Only deleting user_id but leaving other session data
Using session.clear, which doesn't regenerate the session ID
Setting session[:user_id] to nil without resetting session
3. Given this Rails controller code for login:
def create
user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
session[:user_id] = user.id
redirect_to dashboard_path
else
flash[:alert] = 'Invalid login'
render :new
end
end
What happens if the password is incorrect?
medium
A. User is redirected to dashboard
B. User ID is saved in session
C. Application crashes with error
D. Login form is re-rendered with alert
Solution
Step 1: Analyze the if condition
The condition user&.authenticate(params[:password]) returns false if password is wrong, so the else block runs.
Step 2: Understand else block behavior
The else block sets a flash alert and re-renders the login form with render :new.
Final Answer:
Login form is re-rendered with alert -> Option D
Quick Check:
Wrong password triggers else block [OK]
Hint: Wrong password triggers else block with alert [OK]
Common Mistakes:
Assuming redirect happens on wrong password
Thinking session is set even if password fails
Believing app crashes on wrong password
4. Identify the error in this logout action:
def destroy
session[:user_id] = nil
redirect_to login_path
end
What is the main issue with this logout method?
medium
A. It does not clear the entire session
B. It redirects to the wrong path
C. It raises a syntax error
D. It does not delete the user record
Solution
Step 1: Check session clearing method
Setting session[:user_id] = nil only removes the user ID but leaves other session data intact.
Step 2: Understand best practice for logout
Best practice is to use reset_session to clear all session data and prevent session fixation attacks.
Final Answer:
It does not clear the entire session -> Option A
Quick Check:
Partial session clearing is insecure [OK]
Hint: Partial session clearing leaves data behind; use reset_session [OK]
Common Mistakes:
Thinking setting user_id to nil clears session fully
Ignoring session fixation security risks
Assuming redirect path affects logout correctness
5. You want to ensure users cannot access the dashboard without logging in. Which code snippet correctly enforces this in a Rails controller using the login session?
hard
A. before_action :require_login
def require_login
redirect_to login_path if session[:user_id].present?
end
B. before_action :require_login
def require_login
redirect_to dashboard_path if session[:user_id].nil?
end
C. before_action :require_login
def require_login
redirect_to login_path unless session[:user_id]
end
D. before_action :require_login
def require_login
redirect_to login_path if session[:user_id] == true
end
Solution
Step 1: Understand login check logic
Users should be redirected to login if session[:user_id] is missing (nil or false).
Step 2: Analyze each option's condition
before_action :require_login
def require_login
redirect_to login_path unless session[:user_id]
end redirects to login unless user_id exists, correctly blocking access. Others have incorrect conditions or redirect to wrong paths.
Final Answer:
before_action :require_login with redirect unless session[:user_id] -> Option C
Quick Check:
Redirect to login if no user_id [OK]
Hint: Redirect unless session[:user_id] exists to block access [OK]
Common Mistakes:
Using wrong condition logic for session check
Redirecting to dashboard instead of login
Checking session[:user_id] == true which is incorrect
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.