Bird
Raised Fist0
Ruby on Railsframework~30 mins

Partial templates in Ruby on Rails - Mini Project: Build & Apply

Choose your learning style10 modes available
Using Partial Templates in Rails Views
📖 Scenario: You are building a simple blog application in Rails. You want to display a list of blog posts on the homepage. Each post has a title and a short description. To keep your views clean and reusable, you will use partial templates for each post.
🎯 Goal: Create a Rails view that uses a partial template to render each blog post's title and description. This will help you reuse the post display code easily in other parts of the app.
📋 What You'll Learn
Create a list of posts as an array of hashes in the controller
Create a partial template named _post.html.erb to display a single post's title and description
Render the partial for each post in the main view using render partial: 'post', locals: { post: post }
Pass the correct local variable post to the partial
💡 Why This Matters
🌍 Real World
Partial templates help keep Rails views clean and DRY (Don't Repeat Yourself). They are used in real apps to reuse UI components like posts, comments, or user profiles.
💼 Career
Knowing how to use partials is essential for Rails developers to build maintainable and scalable web applications.
Progress0 / 4 steps
1
Set up the posts data in the controller
In the controller action, create a variable called @posts and assign it an array with these exact hashes: { title: 'First Post', description: 'This is the first blog post.' } and { title: 'Second Post', description: 'This is the second blog post.' }.
Ruby on Rails
Hint

Use an instance variable @posts and assign it an array of hashes with keys :title and :description.

2
Create the partial template _post.html.erb
Create a partial template file named _post.html.erb inside the views folder. Inside it, display the post's title inside an <h2> tag and the description inside a <p> tag. Use the local variable post to access the post data.
Ruby on Rails
Hint

Use ERB tags <%= %> to output post[:title] and post[:description].

3
Render the partial for each post in the main view
In the main view file (e.g., index.html.erb), use a for loop with variable post to iterate over @posts. Inside the loop, render the partial 'post' and pass the current post as a local variable using render partial: 'post', locals: { post: post }.
Ruby on Rails
Hint

Use ERB tags <% %> for the loop and <%= %> to render the partial.

4
Add a container div with aria-label for accessibility
Wrap the posts list in the main view (index.html.erb) inside a <div> with an aria-label attribute set to 'Blog posts list' for accessibility.
Ruby on Rails
Hint

Use a <div> with aria-label="Blog posts list" wrapping the loop.

Practice

(1/5)
1. What is the main purpose of using partial templates in Rails views?
easy
A. To define routes for the application
B. To speed up database queries
C. To handle user authentication
D. To reuse small pieces of view code across different pages

Solution

  1. Step 1: Understand what partial templates are

    Partial templates are small view files that can be included in other views to avoid repeating code.
  2. Step 2: Identify the main use case

    The main use is to reuse small pieces of view code across different pages, improving maintainability.
  3. Final Answer:

    To reuse small pieces of view code across different pages -> Option D
  4. Quick Check:

    Partial templates = reuse view code [OK]
Hint: Partial templates reuse view parts, not logic or routes [OK]
Common Mistakes:
  • Thinking partials speed up database queries
  • Confusing partials with authentication logic
  • Assuming partials define routes
2. Which of the following is the correct syntax to render a partial named _menu.html.erb in a Rails view?
easy
A. <%= partial 'menu' %>
B. <%= render 'menu' %>
C. <%= include 'menu' %>
D. <%= render_partial 'menu' %>

Solution

  1. Step 1: Recall the Rails partial rendering syntax

    Rails uses render 'partial_name' to include partials, omitting the underscore and file extension.
  2. Step 2: Match the correct syntax

    The correct syntax is <%= render 'menu' %> to render _menu.html.erb.
  3. Final Answer:

    <%= render 'menu' %> -> Option B
  4. Quick Check:

    Render partial = render 'name' [OK]
Hint: Use render 'partial_name' without underscore or extension [OK]
Common Mistakes:
  • Using 'partial' instead of 'render'
  • Using 'include' which is not a Rails helper
  • Adding underscore in render argument
3. Given the following code in a Rails view:
<%= render partial: 'product', collection: @products, as: :item %>

What will be the local variable name inside the _product.html.erb partial for each item?
medium
A. item
B. product
C. @products
D. collection

Solution

  1. Step 1: Understand collection rendering with 'as'

    When rendering a collection with render partial: 'name', collection: ..., as: :var, each element is passed as var inside the partial.
  2. Step 2: Identify the local variable name

    Here, as: :item means inside _product.html.erb each element is accessible as item.
  3. Final Answer:

    item -> Option A
  4. Quick Check:

    Collection with 'as' sets local variable name [OK]
Hint: Use 'as' option to rename local variable in collection partial [OK]
Common Mistakes:
  • Assuming default variable name 'product' instead of 'item'
  • Using instance variable '@products' inside partial
  • Confusing 'collection' as variable name
4. What is wrong with this code snippet in a Rails view?
<%= render 'user', user: @user %>

Assuming the partial is named _user.html.erb and expects a local variable user.
medium
A. The syntax should be render partial: 'user', locals: { user: @user }
B. The partial name should include the underscore: render '_user'
C. The code is correct and will work as expected
D. You cannot pass local variables to partials

Solution

  1. Step 1: Check the shorthand syntax for passing locals

    Rails allows passing locals directly by naming the variable in the render call, like render 'user', user: @user.
  2. Step 2: Confirm partial naming rules

    The underscore is omitted in the render call; Rails finds _user.html.erb automatically.
  3. Final Answer:

    The code is correct and will work as expected -> Option C
  4. Quick Check:

    Passing locals shorthand is valid [OK]
Hint: Passing locals as named args in render is valid shorthand [OK]
Common Mistakes:
  • Thinking underscore is required in render argument
  • Believing locals must be inside a hash named 'locals'
  • Assuming locals cannot be passed at all
5. You want to render a list of comments using a partial _comment.html.erb. Each comment should be passed as comment local variable. Which is the best way to do this in Rails?
hard
A. <%= render partial: 'comment', collection: @comments %>
B. <%= render 'comment', comments: @comments %>
C. <%= render partial: 'comment', collection: @comments, as: :comments %>
D. <%= render partial: 'comment', locals: { comment: @comments } %>

Solution

  1. Step 1: Understand collection rendering default variable

    When rendering a collection with render partial: 'comment', collection: @comments, Rails passes each element as comment by default (partial name without underscore).
  2. Step 2: Evaluate other options

    <%= render 'comment', comments: @comments %> passes the whole array as a single local, not each comment. <%= render partial: 'comment', collection: @comments, as: :comments %> passes each as comments (plural). <%= render partial: 'comment', locals: { comment: @comments } %> passes the entire array as one variable, not individual comments.
  3. Final Answer:

    <%= render partial: 'comment', collection: @comments %> -> Option A
  4. Quick Check:

    Collection rendering uses partial name as local by default [OK]
Hint: Render collection with partial name to get default local variable [OK]
Common Mistakes:
  • Passing whole array as one local variable
  • Using 'as: :comments' which sets plural local name
  • Confusing locals hash with collection rendering
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard