2011-11-07 36 views
0

我是新来的Rails(使用3.1),我期待有一个看起来像这样的URL:Rails的:如何处理国家和城市嵌套路线

domain.com/jobs/florida/orlando

我知道这是典型的路线之外的行动和一个身份证,所以最好的办法是什么?这会落在嵌套路由下吗?

更深层次 - 如果有人点击/作业页面,他们会看到一个状态列表。如果他们打到/ jobs/florida页面,他们会看到一个城市列表。最后,如果他们击中/ jobs/florida/orlando,他们会看到在奥兰多开设的一份工作清单。

我的路线是什么样的?我应该以另一种方式思考这个URL结构吗?我的主要动机是搜索引擎优化 - 这些网页通常不会以用户的身份登录,只要他们通过搜索结果找到该网站即可。

谢谢!

回答

0

你可以这样做在你的routes.rb文件,如果你有一个固定的深度

match 'jobs/:state/:city/:neighborhood' => "Jobs#show" 

在你的表演动作,那么你可以看看PARAMS [:状态],则params [:城市]等,并加载相应的作业。

+0

到目前为止,所有给出的三个答案都非常出色,我选择了这一个它的简单。感谢您帮助导航菜鸟! – Jason

+0

从3个答案选择了一个不能解决你问题的答案 - 匹配'/ jobs'和'/ jobs/florida'。这一条路线只匹配完整路径。 – MBO

1

您应该从导轨指南看dynamic segments。基本上,你的例子应该有这样的路线:

get "/jobs(/:state(/:city))", :to => "jobs#index" 

,并在JobsControllerindex行动,你检查,如果你有选择的国家和城市的选择。如果是,则显示来自该区域的作业列表,如果不是,则显示比当前级别更深层次的嵌套。

如果它会帮助,你可以传播这个途径3个不同的:

get "/jobs", :to => "jobs#index_without_state" 
get "/jobs/:state", :to => "jobs#index_without_city" 
get "/jobs/:state/:city", :to => "jobs#index" 

或者无论你的感觉,但我认为这是过度设计和第一命题不应该更难实施(尤其是当您可以提取一些逻辑来before_filters如果你从路线特定部分)

+0

+1从来不知道动态细分。凉! – CambridgeMike

1

我也有类似的问题,解决它想:

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/floridastates#show与STATE_ID =佛罗里达

  • /jobs/new-yorkstates#show与STATE_ID =新约克

  • /jobs/florida/orlandocities#show与city_id =奥兰多

有趣的来了!您可以使用蛞蝓你的工作,以及:

  • /jobs/1234-experienced-senior-programmerjobs#show1234-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"} 
+0

感谢您解释这一点。这是巨大的! – Abram