Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Naming params of nested routes

resources :leagues do
  resources :schedule
end

This generates:

leagues/:id
leagues/:league_id/schedule/:id

How can I keep the league ID from changing param names? So it'll be:

leagues/:id
leagues/:id/schedule/:schedule_id
like image 277
Fred Fickleberry III Avatar asked Dec 22 '22 08:12

Fred Fickleberry III


2 Answers

No, please do not do this.

The reason for it being this way is that it provides a common interface for nested resources across every single application. By making it different in your application, you're effectively going "against the grain" of Rails. Rails has a strict set of conventions that you should stick to. When you stray from this path, things get messy.


However, if you do want to shoot yourself in the foot, metaphorically speaking, you will need to define the routes manually. Here's the routes for the seven standard actions in a controller:

get 'leagues/:id/schedules', :to => "schedules#index", :as => "league_schedules"
get 'leagues/:id/schedule/:schedule_id', :to => "schedules#show", :as => "league_schedule"
get 'leagues/:id/schedules/new', :to => "schedules#new", :as => "new_league_schedule"
post 'leagues/:id/schedules', :to => "schedules#create"
get 'leagues/:id/schedule/:schedule_id/edit', :to => "schedules#edit", :as => "ed it_league_schedule"
put 'leagues/:id/schedule/:schedule_id', :to => "schedules#update"
delete 'leagues/:id/schedule/:schedule_id', :to => "schedules#destroy"

As you can see, it's quite ugly. But, if you really really really want to do it this way, that's how you'd do it.

like image 85
Ryan Bigg Avatar answered Dec 29 '22 10:12

Ryan Bigg


You can set "param" option on resource route to override the default "id" param:

resources :leagues do
  resources :schedule, param: schedule_id
end

refs to the Rails Routing Doc: http://guides.rubyonrails.org/routing.html#overriding-named-route-parameters

like image 38
mios Avatar answered Dec 29 '22 11:12

mios