我也有类似的问题,解决它想:
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/florida
去states#show
与STATE_ID =佛罗里达
/jobs/new-york
去states#show
与STATE_ID =新约克
/jobs/florida/orlando
去cities#show
与city_id =奥兰多
有趣的来了!您可以使用蛞蝓你的工作,以及:
/jobs/1234-experienced-senior-programmer
去jobs#show
与1234-experienced-senior-programmer
为ID,只是做params[:id].to_i
,你将获得ID 1234 :)
的不那么有趣的部分:
收集方法,如/jobs/new
就不管用了 - 你可以通过添加一个量词像:state_id => /[a-z\-]{4,}/
改变此 这需要国家的名字至少有4个字符,所有3个字母的收集方法就像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"}
到目前为止,所有给出的三个答案都非常出色,我选择了这一个它的简单。感谢您帮助导航菜鸟! – Jason
从3个答案选择了一个不能解决你问题的答案 - 匹配'/ jobs'和'/ jobs/florida'。这一条路线只匹配完整路径。 – MBO