У меня была похожая проблема, и я решил ее следующим образом:
resources :jobs do
collection do
constraints :state_id => /[a-z\-]+/ do
get ':state_id' => 'states#show', :as => :state
get ':state_id/:city_id' => 'cities#show', :as => :city
end
end
end
/jobs
перейдет к jobs#index
У вас не должно быть номеров в названиях городов / штатов!
/jobs/florida
переходит к states#show
с state_id = florida
/jobs/new-york
переходит к states#show
с помощью state_id = Нью-Йорк
/jobs/florida/orlando
идет к cities#show
с city_id = orlando
Теперь самое интересное! Вы также можете использовать слизней для своей работы:
/jobs/1234-experienced-senior-programmer
идет к jobs#show
с 1234-experienced-senior-programmer
в качестве идентификатора, просто наберите params[:id].to_i
, и вы получите идентификатор 1234:)
Не очень веселая часть:
методы сбора, такие как /jobs/new
, больше не будут работать - вы можете изменить это, добавив квантификатор, такой как :state_id => /[a-z\-]{4,}/
, поэтому
для этого необходимо, чтобы имена состояний имели как минимум 4 символа, и все трехбуквенные методы сбора, такие как new
, будут, как обычно, передаваться в контроллер заданий
сгенерированные маршруты:
state_jobs GET /jobs/:state_id(.:format) {:controller=>"states", :state_id=>/[a-z\-]+/, :action=>"show"}
city_jobs GET /jobs/:state_id/:city_id(.:format) {:controller=>"cities", :state_id=>/[a-z\-]+/, :action=>"show"}
jobs GET /jobs(.:format) {:controller=>"jobs", :action=>"index"}
POST /jobs(.:format) {:controller=>"jobs", :action=>"create"}
new_job GET /jobs/new(.:format) {:controller=>"jobs", :action=>"new"}
edit_job GET /jobs/:id/edit(.:format) {:controller=>"jobs", :action=>"edit"}
job GET /jobs/:id(.:format) {:controller=>"jobs", :action=>"show"}
PUT /jobs/:id(.:format) {:controller=>"jobs", :action=>"update"}
DELETE /jobs/:id(.:format) {:controller=>"jobs", :action=>"destroy"}