Bird
Raised Fist0
Ruby on Railsframework~5 mins

Route parameters in Ruby on Rails

Choose your learning style10 modes available
Introduction

Route parameters let your app get information from the URL. This helps show different content based on what the user asks for.

Showing a user profile page based on the user ID in the URL.
Displaying a blog post using the post's unique ID from the URL.
Filtering products by category name passed in the URL.
Navigating to a specific order detail page using order number in the URL.
Syntax
Ruby on Rails
get '/items/:id', to: 'items#show'

Use a colon (:) before a word to mark it as a route parameter.

The parameter value is accessible in the controller as params[:id].

Examples
This route captures user_id from the URL and sends it to the show action in UsersController.
Ruby on Rails
get '/users/:user_id', to: 'users#show'
This route uses two parameters: post_id and id, useful for nested resources like comments on posts.
Ruby on Rails
get '/posts/:post_id/comments/:id', to: 'comments#show'
This route uses a parameter name to filter products by category name.
Ruby on Rails
get '/categories/:name/products', to: 'products#index'
Sample Program

This example sets a route with a parameter :id. When you visit /books/5, it shows "Showing book with ID: 5".

Ruby on Rails
Rails.application.routes.draw do
  get '/books/:id', to: 'books#show'
end

class BooksController < ApplicationController
  def show
    book_id = params[:id]
    render plain: "Showing book with ID: #{book_id}"
  end
end
OutputSuccess
Important Notes

Route parameters are always strings. Convert them if you need numbers.

Be careful with parameter names to avoid conflicts with other routes.

Summary

Route parameters let you capture parts of the URL to use in your app.

They are defined with a colon before the name in the route path.

You access them in the controller with params[:parameter_name].

Practice

(1/5)
1. What does a route parameter in Rails do?
get '/users/:id', to: 'users#show'
easy
A. Captures part of the URL as a variable to use in the controller
B. Defines a fixed URL path without variables
C. Specifies the HTTP method to use
D. Sets the controller action to redirect to another page

Solution

  1. Step 1: Understand the colon in the route path

    The colon before id means this part of the URL is a variable, called a route parameter.
  2. Step 2: Role of route parameters in Rails

    This variable is captured from the URL and passed to the controller action for use, like finding a user by ID.
  3. Final Answer:

    Captures part of the URL as a variable to use in the controller -> Option A
  4. Quick Check:

    Route parameter = URL variable [OK]
Hint: Colon before name means URL part is a variable [OK]
Common Mistakes:
  • Thinking route parameters define fixed paths
  • Confusing route parameters with HTTP methods
  • Assuming route parameters redirect to other pages
2. Which of the following is the correct syntax to define a route with a parameter named post_id in Rails?
easy
A. get '/posts/post_id', to: 'posts#show'
B. get '/posts/{post_id}', to: 'posts#show'
C. get '/posts/<post_id>', to: 'posts#show'
D. get '/posts/:post_id', to: 'posts#show'

Solution

  1. Step 1: Identify correct route parameter syntax

    In Rails, route parameters use a colon before the name, like :post_id.
  2. Step 2: Compare options

    Only get '/posts/:post_id', to: 'posts#show' uses the colon syntax correctly. Others use incorrect braces or no colon.
  3. Final Answer:

    get '/posts/:post_id', to: 'posts#show' -> Option D
  4. Quick Check:

    Colon before parameter name = correct syntax [OK]
Hint: Use colon before parameter name in route path [OK]
Common Mistakes:
  • Using curly braces or angle brackets instead of colon
  • Omitting colon before parameter name
  • Confusing parameter syntax with query strings
3. Given this route:
get '/products/:id', to: 'products#show'
And this controller code:
def show
  @product_id = params[:id]
end

What will @product_id be if the URL is /products/42?
medium
A. The string '42'
B. The integer 42
C. nil
D. An error because params[:id] is undefined

Solution

  1. Step 1: Understand route parameter capture

    The :id in the route captures the URL part '42' as a string in params[:id].
  2. Step 2: Assigning params value in controller

    The controller assigns @product_id = params[:id], so @product_id is the string '42'. Rails does not convert it automatically to integer.
  3. Final Answer:

    The string '42' -> Option A
  4. Quick Check:

    Route params are strings by default [OK]
Hint: Route params are strings unless converted [OK]
Common Mistakes:
  • Assuming params[:id] is an integer automatically
  • Expecting nil if parameter is present
  • Thinking params[:id] causes an error if defined in route
4. Identify the error in this route definition:
get '/orders/:order_id/items/:item_id', to: 'orders#item'

Controller action:
def item
  @order = Order.find(params[:id])
  @item = Item.find(params[:item_id])
end
medium
A. Route path should not have two parameters
B. params[:id] is incorrect; should be params[:order_id]
C. Controller action name should be 'show' not 'item'
D. Item.find should use params[:id] instead of params[:item_id]

Solution

  1. Step 1: Check route parameters names

    The route defines parameters :order_id and :item_id, so params keys are :order_id and :item_id.
  2. Step 2: Check controller parameter usage

    The controller incorrectly uses params[:id] which does not exist. It should use params[:order_id] to find the order.
  3. Final Answer:

    params[:id] is incorrect; should be params[:order_id] -> Option B
  4. Quick Check:

    Parameter names must match route keys [OK]
Hint: Match params keys exactly to route parameter names [OK]
Common Mistakes:
  • Using generic :id when route uses :order_id
  • Thinking multiple parameters are not allowed
  • Confusing controller action names with route parameters
5. You want to create a nested route to show a comment belonging to a post using route parameters. Which route definition correctly captures both post_id and id for the comment?
hard
A. get '/posts/:id/comments/:post_id', to: 'comments#show'
B. get '/posts/comments/:post_id/:id', to: 'comments#show'
C. get '/posts/:post_id/comments/:id', to: 'comments#show'
D. get '/comments/:id/posts/:post_id', to: 'comments#show'

Solution

  1. Step 1: Understand nested resource URL structure

    Nested routes usually put the parent resource first, then the child. Here, post_id comes before id for comment.
  2. Step 2: Check route parameter order and names

    get '/posts/:post_id/comments/:id', to: 'comments#show' correctly uses /posts/:post_id/comments/:id capturing post's ID and comment's ID in order.
  3. Final Answer:

    get '/posts/:post_id/comments/:id', to: 'comments#show' -> Option C
  4. Quick Check:

    Parent ID first, child ID second in nested routes [OK]
Hint: Parent resource param before child in nested routes [OK]
Common Mistakes:
  • Swapping order of post_id and comment id
  • Putting parameters in wrong positions
  • Using incorrect parameter names
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