Dan L
Dan L

Reputation: 4439

Rails routing: add a custom route to the standard list of actions

Rails routes create the 7 CRUD actions by default following REST.

resources :users

However, I have a confirm_destroy action that I use in almost every resource, because I have a lot of logic that goes on the confirmation page; it's not just a simple yes/no alert dialog.

resources :users do
  get :confirm_destroy, on: :member
end

With 50+ resources, it gets tedious to write this out for each resource and my routes file is literally 3x longer because of this.

Is there any way to add an action to the standard 7 for the resources block such that

resources :users

would be the same as

resources :users do
  get :confirm_destroy, on: :member
end

and I can use it in the routes as a standard action, ie:

resources :users, only: [:show, :confirm_destroy, :destroy]

resources :users, except: [:confirm_destroy]

Upvotes: 3

Views: 381

Answers (1)

Ryenski
Ryenski

Reputation: 9692

While not quite as elegant as you might like, the Rails way would be to use a routing concern, as @dbugger suggested.

For example:

concern :confirmable do
  get 'confirm_destroy', on: :member
end

resources :users, :widgets, concerns: :confirmable
$ rails routes
                                  Prefix Verb   URI Pattern                                                                                       Controller#Action
                    confirm_destroy_user GET    /users/:id/confirm_destroy(.:format)                                                              users#confirm_destroy
                                   users GET    /users(.:format)                                                                                  users#index
                                         POST   /users(.:format)                                                                                  users#create
                                new_user GET    /users/new(.:format)                                                                              users#new
                               edit_user GET    /users/:id/edit(.:format)                                                                         users#edit
                                    user GET    /users/:id(.:format)                                                                              users#show
                                         PATCH  /users/:id(.:format)                                                                              users#update
                                         PUT    /users/:id(.:format)                                                                              users#update
                                         DELETE /users/:id(.:format)                                                                              users#destroy
                  confirm_destroy_widget GET    /widgets/:id/confirm_destroy(.:format)                                                            widgets#confirm_destroy
                                 widgets GET    /widgets(.:format)                                                                                widgets#index
                                         POST   /widgets(.:format)                                                                                widgets#create
                              new_widget GET    /widgets/new(.:format)                                                                            widgets#new
                             edit_widget GET    /widgets/:id/edit(.:format)                                                                       widgets#edit
                                  widget GET    /widgets/:id(.:format)                                                                            widgets#show
                                         PATCH  /widgets/:id(.:format)                                                                            widgets#update
                                         PUT    /widgets/:id(.:format)                                                                            widgets#update
                                         DELETE /widgets/:id(.:format)                                                                            widgets#destroy

Upvotes: 1

Related Questions