API versioning helps keep your app working smoothly when you add new features or change old ones. It lets different users use different versions without breaking anything.
You want to add new features to your API without stopping old apps from working.
You need to fix bugs or improve your API but don't want to break existing users.
You want to support multiple clients that expect different API behaviors.
You plan to change how your API works but want to keep old versions available.
You want to organize your API code clearly by versions.
Syntax
Ruby on Rails
namespace :api do
namespace :v1 do
resources :posts
end
namespace :v2 do
resources :posts
end
end
Use namespace to group routes by version.
Each version can have its own controllers and logic.
Examples
This defines a version 1 API route for listing users.
Ruby on Rails
namespace :api do
namespace :v1 do
get 'users', to: 'users#index'
end
end
This defines a version 2 API route for listing users, which can behave differently from v1.
Ruby on Rails
namespace :api do
namespace :v2 do
get 'users', to: 'users#index'
end
end
Controller for API version 1 with a simple JSON response.
Ruby on Rails
module Api
module V1
class UsersController < ApplicationController
def index
render json: { message: 'Hello from v1' }
end
end
end
end
Controller for API version 2 with updated response.
Ruby on Rails
module Api
module V2
class UsersController < ApplicationController
def index
render json: { message: 'Hello from v2 with new data' }
end
end
end
end
Sample Program
This example shows two API versions with the same route /api/v1/greet and /api/v2/greet. Each version returns a different message in JSON format.
Ruby on Rails
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
get 'greet', to: 'greetings#show'
end
namespace :v2 do
get 'greet', to: 'greetings#show'
end
end
end
module Api
module V1
class GreetingsController < ApplicationController
def show
render json: { message: 'Hello from API v1' }
end
end
end
end
module Api
module V2
class GreetingsController < ApplicationController
def show
render json: { message: 'Hello from API v2 with extra info' }
end
end
end
end
OutputSuccess
Important Notes
Keep your version folders and controllers organized to avoid confusion.
Use semantic versioning if you want to be more precise (like v1.0, v1.1).
Remember to update your API documentation for each version.
Summary
API versioning helps you update your API without breaking old users.
Use namespaces in Rails routes to separate versions.
Each version can have its own controllers and responses.
Practice
(1/5)
1. What is the main purpose of API versioning in a Rails application?
easy
A. To change the database schema automatically
B. To allow updates without breaking existing API users
C. To speed up database queries
D. To improve the UI design of the application
Solution
Step 1: Understand API versioning concept
API versioning allows developers to release new API features or changes without affecting users who rely on older versions.
Step 2: Identify the main benefit
This prevents breaking changes and keeps old clients working while new clients can use updated features.
Final Answer:
To allow updates without breaking existing API users -> Option B
Quick Check:
API versioning = safe updates [OK]
Hint: API versioning = safe updates without breaking old clients [OK]
Common Mistakes:
Thinking it speeds up database queries
Confusing with UI improvements
Assuming it changes database schema automatically
2. Which of the following is the correct way to define API versioning in Rails routes using namespaces?
easy
A. version :v1 do
resources :users
end
B. scope :v1 do
resources :users
end
C. namespace :v1 do
resources :users
end
D. api_version :v1 do
resources :users
end
Solution
Step 1: Recall Rails routing syntax for versioning
Rails uses the namespace method to group routes under a version folder like v1.
Step 2: Check each option
Only namespace :v1 do ... end is valid Rails syntax for versioning routes.
Final Answer:
namespace :v1 do
resources :users
end -> Option C
Quick Check:
Rails versioning uses namespace [OK]
Hint: Use namespace for version folders in routes [OK]
Common Mistakes:
Using non-existent 'version' or 'api_version' methods
Using scope without path or module options
Confusing namespace with scope
3. Given this routes setup in Rails:
namespace :v1 do
get 'status', to: 'health#show'
end
namespace :v2 do
get 'status', to: 'health#show'
end
What will GET /v2/status call?
medium
A. The show action in HealthController inside V2 module
B. The show action in the main HealthController without module
C. A routing error because v2 is not defined
D. The show action in HealthController inside V1 module
Solution
Step 1: Understand namespace routing effect
Each namespace creates a module scope. So v2 routes call controllers inside V2:: module.
Step 2: Match the route to controller
GET /v2/status calls V2::HealthController#show, not the v1 or main controller.
Final Answer:
The show action in HealthController inside V2 module -> Option A
namespace :v1 do
resources :products
end
namespace :v1 do
resources :orders
end
What is the problem with this code?
medium
A. You must use scope instead of namespace for versioning
B. Rails does not allow multiple namespaces with the same name
C. Resources inside namespaces must be singular, not plural
D. Duplicate namespace declarations can be merged into one block
Solution
Step 1: Analyze namespace usage
Rails allows multiple namespace blocks with the same name but it's better style to merge them.
Step 2: Identify best practice
Merging namespace :v1 blocks into one improves readability and avoids confusion.
Final Answer:
Duplicate namespace declarations can be merged into one block -> Option D
Quick Check:
Merge same namespaces for clarity [OK]
Hint: Merge same namespaces into one block [OK]
Common Mistakes:
Thinking Rails forbids multiple same namespaces
Using singular resources incorrectly
Confusing namespace with scope
5. You want to support two API versions in your Rails app: v1 and v2. v1 returns user data with name only, but v2 adds email. How should you organize your controllers to handle this cleanly?
hard
A. Create separate controllers under app/controllers/v1/users_controller.rb and app/controllers/v2/users_controller.rb with different responses
B. Use a single controller and check version in each action to decide response
C. Put all logic in the model and use one controller for both versions
D. Use middleware to rewrite responses after controller runs
Solution
Step 1: Understand version separation best practice
Separate controllers per version keep code clean and maintainable, avoiding complex conditionals.
Step 2: Apply Rails versioning pattern
Place controllers in versioned folders like v1/users_controller.rb and v2/users_controller.rb to handle different responses.
Final Answer:
Create separate controllers under app/controllers/v1/users_controller.rb and app/controllers/v2/users_controller.rb with different responses -> Option A
Quick Check:
Separate controllers per version = clean code [OK]
Hint: Use separate controllers per version folder [OK]
Common Mistakes:
Using one controller with many version checks
Putting version logic in models
Trying to rewrite responses with middleware
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.