All the ways to generate routing paths in Rails

All the ways to generate routing paths in Rails

Have you ever considered how many ways there are to generate a routing path in Rails? Plenty. Let’s see.

Imagine that your config/routes.rb contains:

Rails.application.routes.draw do
  namespace :admin do
    resources :exercises
    get '/' => redirect("/admin/exercises")

So the generated routes are:

> rake routes

             Prefix Verb  URI Pattern                         Controller#Action
    admin_exercises GET   /admin/exercises(.:format)          admin/exercises#index
                    POST  /admin/exercises(.:format)          admin/exercises#create
 new_admin_exercise GET   /admin/exercises/new(.:format)      admin/exercises#new
edit_admin_exercise GET   /admin/exercises/:id/edit(.:format) admin/exercises#edit
     admin_exercise PATCH /admin/exercises/:id(.:format)      admin/exercises#update
                    PUT   /admin/exercises/:id(.:format)      admin/exercises#update

              admin GET   /admin(.:format)                    redirect(301, /admin/exercises)

And in the admin panel, on the list of exercises (Admin::ExercisesController#index action which renders admin/exercises/index.html.erb) you want to link to a single exercise.

What are your options? There are some obvious ones and less obvious ones.


You can just use edit_admin_exercise_path(exercise) or edit_admin_exercise_path( or edit_admin_exercise_path(id: If I recall correctly, all of them are going to work.

I think this is the most often used option.

Of course instead of _path sometimes you are going to need _url.

[:edit, :admin, exercise]

You can use [:edit, :admin, exercise]. In some places I’ve seen developers using [:admin, exercise] for admin_exercises route, but I’ve never seen this syntax being used for edit_admin_exercise routes and similar ones.

I don’t expect my coworkers to use this version and during refactorings I most likely won’t find this usage.

{action: :edit, controller: "admin/exercises", id:, }

You don’t see this version used very much since Rails introduced named routes. But that will work as well. It probably accepts strings and symbols as values for action/controller keys.

{action: :edit, id: }

If you are linking between actions in the same controller you can omit the controller parameter. I always liked this syntax for one reason. It does not include controller’s name.

That means if you ever decide to rename Admin::ExercisesController to Moderator::ExercisesController or Admin::PublicExercisesController and make some changes in your config/routes.rb so that the routes and controllers follow the same naming convention, at leas you would not need to change the links that go between views in the same controller. One less thing to worry about when doing refactorings.


You can always provide a hand-crafted String as the path. LOL 😋 . I would rather not do it, ever :)


Usually we use named routes such as edit_admin_exercise which are available via methods. But the other options are worth knowing about and they can be useful when you need to generate URLs to various actions or controllers more dynamically.

Struggling to apply DDD concepts to your Rails app?

For a few years we’ve been studying Domain-Driven Design and applying its techniques in our projects. In this book we describe techniques that you can use in new and old Rails apps to achieve better architecture. They were useful to us and we are sure they are going to be useful for you.

Click here to read more!

Domain-Driven Rails

There is more... check out other books published by us

You might also like