2011-11-07 58 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