📖 Scenario: You are creating a simple Rails application to manage a list of books. Each book has a title and an author. You want to build action methods in a controller to show a list of books and display details of a single book.
🎯 Goal: Build a Rails controller with action methods index and show to list all books and show details of one book.
📋 What You'll Learn
Create a BooksController class
Add an index action method that sets @books to all books
Add a show action method that finds a book by params[:id] and sets @book
Use Rails conventions for controller and action methods
💡 Why This Matters
🌍 Real World
Controllers in Rails handle user requests and prepare data for views. Action methods like index and show are common for listing and displaying records.
💼 Career
Understanding how to write action methods in Rails controllers is essential for backend web development roles using Ruby on Rails.
Progress0 / 4 steps
1
Create BooksController class
Create a Rails controller class called BooksController that inherits from ApplicationController.
Ruby on Rails
Hint
Controllers in Rails are classes that inherit from ApplicationController.
2
Add index action method
Inside the BooksController class, add an index action method that sets an instance variable @books to Book.all.
Ruby on Rails
Hint
Action methods are defined with def and set instance variables for views.
3
Add show action method
Inside the BooksController class, add a show action method that sets an instance variable @book by finding a book with Book.find(params[:id]).
Ruby on Rails
Hint
The show action finds a single record using params[:id].
4
Complete controller with both actions
Ensure the BooksController class contains both index and show action methods exactly as specified.
Ruby on Rails
Hint
Double-check both action methods are inside the controller class.
Practice
(1/5)
1. What is the primary role of an action method in a Rails controller?
easy
A. To respond to user requests by processing data and rendering views or redirects
B. To define database schema and migrations
C. To style the HTML pages with CSS
D. To manage server configuration settings
Solution
Step 1: Understand the purpose of action methods
Action methods in Rails controllers handle user requests by processing data and deciding what to show next.
Step 2: Differentiate from other roles
Database schema, styling, and server settings are handled elsewhere, not in action methods.
Final Answer:
To respond to user requests by processing data and rendering views or redirects -> Option A
Quick Check:
Action methods handle requests = A [OK]
Hint: Action methods handle requests and responses in controllers [OK]
Common Mistakes:
Confusing action methods with database migrations
Thinking action methods style pages
Assuming action methods configure servers
2. Which of the following is the correct syntax to define an action method named show in a Rails controller?
easy
A. function show() {}
B. def show; end
C. show() => {}
D. def show() {}
Solution
Step 1: Recall Ruby method syntax in Rails controllers
Rails controller actions are Ruby methods defined with def method_name; end.
Step 2: Identify correct syntax
def show; end uses correct Ruby syntax without parentheses, which is common in Rails.
Final Answer:
def show; end -> Option B
Quick Check:
Ruby method syntax = A [OK]
Hint: Rails actions use Ruby method syntax: def name; end [OK]
Common Mistakes:
Using JavaScript function syntax
Adding parentheses with braces in Ruby
Mixing arrow functions with Ruby
3. Given this Rails controller action:
def index
@users = User.all
end
What will @users contain after this action runs?
medium
A. A hash of user attributes
B. A single User record
C. An array of all User records from the database
D. An empty array
Solution
Step 1: Understand User.all in Rails
User.all fetches all records from the users table as an ActiveRecord collection (like an array).
Step 2: Determine the content of @users
It will contain all user records, not just one or empty or a hash.
Final Answer:
An array of all User records from the database -> Option C
Quick Check:
User.all returns all records = D [OK]
Hint: User.all fetches all records as a collection [OK]
Common Mistakes:
Thinking User.all returns a single record
Assuming it returns a hash
Confusing with empty array if no users exist
4. Identify the error in this Rails controller action:
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
render :new
end
end
medium
A. Missing an end keyword
B. Using render instead of redirect_to in else
C. Redirecting to @user instead of a URL string
D. Using params[:user] directly without strong parameters
Solution
Step 1: Check parameter handling in create action
Rails requires strong parameters to whitelist allowed attributes for security.
Step 2: Identify misuse of params[:user]
Using params[:user] directly is unsafe and will cause an error in modern Rails.
Final Answer:
Using params[:user] directly without strong parameters -> Option D
Quick Check:
Strong parameters needed = B [OK]
Hint: Always use strong parameters for mass assignment [OK]
Common Mistakes:
Ignoring strong parameters security
Thinking redirect_to needs a URL string only
Missing end keyword (not true here)
5. You want to add a custom action method publish to your PostsController that changes a post's status to 'published' and then redirects to the post's page. Which code snippet correctly implements this?
hard
A. def publish
@post = Post.find(params[:id])
@post.status = 'published'
@post.save
redirect_to post_path(@post)
end
B. def publish
@post = Post.find(params[:id])
@post.status = 'published'
redirect_to post_path(@post)
end
C. def publish
@post = Post.find(params[:id])
@post.status = 'published'
redirect_to @post
end
D. def publish
@post = Post.find(params[:id])
@post.save(status: 'published')
redirect_to @post
end
Solution
Step 1: Find the post by ID
All options correctly find the post using Post.find(params[:id]).
Step 2: Update the post's status and save changes
def publish
@post = Post.find(params[:id])
@post.status = 'published'
redirect_to @post
end changes status but does not save. def publish
@post = Post.find(params[:id])
@post.status = 'published'
redirect_to post_path(@post)
end changes status but does not save. def publish
@post = Post.find(params[:id])
@post.status = 'published'
@post.save
redirect_to post_path(@post)
end changes status, calls save, then redirects. def publish
@post = Post.find(params[:id])
@post.save(status: 'published')
redirect_to @post
end incorrectly uses save(status: 'published') which is invalid.
Step 3: Redirect to the post's show page
Options A, C, and D redirect correctly. def publish
@post = Post.find(params[:id])
@post.status = 'published'
redirect_to post_path(@post)
end uses post_path(@post) which is also correct.
Final Answer:
def publish
@post = Post.find(params[:id])
@post.status = 'published'
@post.save
redirect_to post_path(@post)
end -> Option A
Quick Check:
Change attribute + save + redirect = C [OK]
Hint: Change attribute, save record, then redirect [OK]
Common Mistakes:
Forgetting to save after changing attribute
Using invalid save syntax with parameters
Not redirecting after update
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.