Catch All Route in Rails 5


Step 1

Create a few products using the scaffold generated code. Let's say television, pillow and table.

Step 2

Generate a controller to handle unknown routes.

rails g controller catch_all index

Step 3

Let's inspect the params sent to the server in the browser.

class CatchAllController < ApplicationController
  def index
    render text: params.inspect

Step 4

Define the catch all route in the routes.rb.

get '*path', to: 'catch_all#index'

Step 5

Browse to http://localhost:3000/tele. In the browser, you will see:

"catch_all", "action"=>"index", "path"=>"tele"} permitted: false>

Browse to http://localhost:3000/tele/mundo. In the browser, you will see:

"catch_all", "action"=>"index", "path"=>"tele/mundo"} permitted: false>

Step 7

Browse to http://localhost:3000/tele/mundo?l=10. In the browser, you will see:

{"l"=>"10", "path"=>"tele/mundo"}

The query parameter is separate from the path key.

Step 8

The request.request_uri is no longer available in Rails 5. Rails 3.0.9 is the last version that had this method. We can use request.url instead:

render text: request.url

Step 9

Reload the page: http://localhost:3000/tele/mundo/manga. Browser output is:


Browse to http://localhost:3000/tele/mundo/manga?q=test. Browser output is:


Step 10

Let's find the product that begins with the string in the first part of the URL.

class CatchAllController < ApplicationController
  def index
    product = Product.where('name LIKE ?', "#{params[:path].first}%").first

    redirect_to product_path(product)

Type http://localhost:3000/tele in the browser. You will go to the television product show page.


In this article, you learned how to use catch all route in Rails 5. This is helpful if you want to handle legacy routes in your app and redirect them to new URL. This way the bookmarks of the users will still work.

Related Articles

Create your own user feedback survey