📖 Scenario: You are building a simple Rails API that returns user information in JSON format. This is common when creating backend services that frontend apps or other services consume.
🎯 Goal: Create a Rails controller action that renders a JSON response with user data.
📋 What You'll Learn
Create a hash with user data including id, name, and email
Set a status code variable for the HTTP response
Render the JSON response using the render json: method with the user data
Include the status code in the render call
💡 Why This Matters
🌍 Real World
APIs often send data as JSON to frontend apps or other services. Knowing how to render JSON in Rails is essential for backend development.
💼 Career
Backend developers frequently build JSON APIs. This skill is fundamental for roles involving Rails API development or full-stack development.
Progress0 / 4 steps
1
Create user data hash
Create a hash called user with these exact key-value pairs: id: 1, name: 'Alice', and email: 'alice@example.com'.
Ruby on Rails
Hint
Use Ruby hash syntax with symbol keys and string values.
2
Set HTTP status code
Create a variable called status_code and set it to :ok to represent a successful HTTP response.
Ruby on Rails
Hint
Use a symbol :ok for the status code.
3
Render JSON response
Use render json: user to render the user hash as JSON in the controller action.
Ruby on Rails
Hint
Use the render method with json: option.
4
Add status code to render call
Modify the render call to include the status: status_code option so the HTTP response uses the status_code variable.
Ruby on Rails
Hint
Add status: status_code inside the render method call.
Practice
(1/5)
1. What does render json: @user do in a Rails controller?
easy
A. It sends the @user object as a JSON response to the client.
B. It renders an HTML view named 'json'.
C. It saves the @user object to the database in JSON format.
D. It redirects the user to a JSON page.
Solution
Step 1: Understand the render method with json option
The render json: command in Rails sends data as JSON format to the client instead of rendering an HTML view.
Step 2: Identify the effect of @user in this context
Passing @user sends the user object data as JSON in the HTTP response.
Final Answer:
It sends the @user object as a JSON response to the client. -> Option A
Quick Check:
render json: @user = send JSON response [OK]
Hint: render json: sends data as JSON response [OK]
Common Mistakes:
Thinking it renders an HTML view named 'json'
Confusing render json with saving data
Assuming it redirects to another page
2. Which of the following is the correct syntax to render a JSON response with a status code 201 in Rails?
easy
A. render json: @post, code: 201
B. render json => @post, status = 201
C. render json: @post status 201
D. render json: @post, status: 201
Solution
Step 1: Identify correct Ruby hash syntax for render options
In Rails, options are passed as key: value pairs separated by commas, e.g., json: @post, status: 201.
Step 2: Check each option for syntax correctness
render json: @post, status: 201 uses correct Ruby hash syntax. Options B, C, and D have syntax errors or wrong keys.
Hint: Use commas and colons for options in render [OK]
Common Mistakes:
Using => instead of : in Ruby 3+ syntax
Missing commas between options
Using wrong keys like code instead of status
3. Given the controller code:
def show
@user = User.find(1)
render json: @user.to_json(only: [:id, :name])
end
What will the JSON response include?
medium
A. {"id":1,"name":"Alice"}
B. {"name":"Alice"}
C. {"id":1}
D. {"id":1,"name":"Alice","email":"alice@example.com"}
Solution
Step 1: Understand the use of to_json(only: [:id, :name])
This limits the JSON output to only the id and name fields of the user object.
Step 2: Identify which fields appear in the JSON response
Only id and name are included, so email is excluded.
Final Answer:
{"id":1,"name":"Alice"} -> Option A
Quick Check:
only: [:id, :name] = id and name fields only [OK]
Hint: only: limits JSON fields included [OK]
Common Mistakes:
Assuming all fields are included by default
Confusing only: with except:
Not calling to_json with options
4. What is wrong with this Rails controller code?
def index
@users = User.all
render json: @users only: [:id, :email]
end
medium
A. The @users variable should be a single user, not all users.
B. The only option should be inside to_json method, not passed directly to render.
C. You cannot render collections as JSON in Rails.
D. The render method requires a template name.
Solution
Step 1: Check how to limit JSON fields for collections
The only option must be passed inside to_json or as a render json: option hash, not as a separate argument.
Step 2: Identify the correct way to pass only option
Correct usage: render json: @users.to_json(only: [:id, :email]) or render json: @users, only: [:id, :email] inside a hash, but the given code passes only outside the hash.
Final Answer:
The only option should be inside to_json method, not passed directly to render. -> Option B
Quick Check:
only option must be inside to_json or render json hash [OK]
Hint: Pass only inside to_json or render json hash [OK]
Common Mistakes:
Passing only as separate argument outside render hash
Thinking collections can't be rendered as JSON
Forgetting to call to_json with options
5. You want to render a JSON response with a list of users, but only include users with active status true and only their id and name fields. Which code correctly does this in a Rails controller?
hard
A. render json: User.where(active: true) only: [:id, :name]
B. render json: User.all.select(:id, :name).where(active true)
C. render json: User.where(active: true).to_json(only: [:id, :name])
D. render json: User.where(active: true).only(:id, :name)
Solution
Step 1: Filter users by active status
Use User.where(active: true) to get only active users.
Step 2: Limit JSON fields to id and name
Call to_json(only: [:id, :name]) to include only those fields in the JSON output.
Step 3: Check each option for correctness
render json: User.where(active: true).to_json(only: [:id, :name]) correctly chains filtering and JSON field limiting. render json: User.all.select(:id, :name).where(active: true) has wrong method order and will error. render json: User.where(active: true), only: [:id, :name] passes only incorrectly. render json: User.where(active: true).only(:id, :name) uses a non-existent only method on ActiveRecord relation.
Final Answer:
render json: User.where(active: true).to_json(only: [:id, :name]) -> Option C
Quick Check:
Filter then to_json with only: fields [OK]
Hint: Filter first, then call to_json with only: [OK]
Common Mistakes:
Using only as a method on ActiveRecord relation
Passing only outside to_json or render json hash
Selecting fields before filtering causing errors
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.