2009-11-18 110 views
1

我有一個網站列出了許多作業,但我也希望每個帳戶都能夠在一個地方訪問它的作業。因此,我用這些路線:Ruby on Rails有條件路由

map.resources :jobs 
map.resource :account, :has_many => :jobs 

這讓我像localhost/jobs/localhost/account/jobs網址。但是,兩者似乎都呈現JobsController::index。我如何在索引操作中創建條件(如何訪問是否在URL中指定了帳戶/作業或只是作業?)或更改帳戶路由以呈現不同的操作?什麼是正確的方法來做到這一點?

+0

你有一個或多個帳戶?聲明「我也想要每個帳戶......」提示多個,但「map.resource:account」暗示了一個。 – avaynshtok 2009-11-18 21:18:25

回答

3

創建路線時,可以使用塊,然後通過一個:controller參數,像這樣

map.resource :account do |account| 
    # If you have a special controller 'AccountJobsController' 
    account.resources :jobs, :controller => "account_jobs" 
end 

這可能是更清潔的你把你的控制器到一個目錄結構,然後你可以以嵌套的方式引用它們。例如:

map.resource :account do |account| 
    account.resources :jobs, :controller => "accounts/jobs" 
end 

如果使用上面的代碼中,你應該再創建應用程序/控制器/帳號/ jobs_controller.rb控制器,它是像這樣定義:

class Account::JobsController < ApplicationController 
    ## 
    ## etc. 
    ## 
end 

您可以隨時使用rake routes來檢查哪些路由已經生成以及他們將使用哪些控制器。

+0

這是一個很好的答案! – 2009-11-18 20:45:05

0

如果你運行「耙路線」,你應該看到這樣的事情

account_jobs GET /accounts/:account_id/jobs/:job_id {:controller => 'jobs', :action => 'index'} 

這意味着當你的行動是通過/帳號/工作路線,你應該有一個叫:ACCOUNT_ID參數。那麼你可以做基於此參數的時存在的邏輯開關:

if params[:account_id].nil? 
    ... 
else 
    ... 
end 
+0

map.resource不能以這種方式工作。 – EmFi 2009-11-18 19:05:36

+0

我只是在一個乾淨的rails項目上做了這個驗證,而且是的,它的確可以這樣工作。 routes.rb: ActionController :: Routing :: Routes.draw do | map | map.resources:工作 地圖。資源:賬戶,:的has_many =>:作業 「耙路線」 account_jobs GET /accounts/:account_id/jobs(.:format){:控制器=> 「工作」,:動作=> 「索引」} 獲取http:// localhost:3000/accounts/123/jobs from日誌: 處理JobsController#索引(對於127.0.0.1,2009-11-18 11:24:22)[GET] 參數:{「account_id」 =>「123」} – avaynshtok 2009-11-18 19:26:00

+0

哎呀,對不起(非)格式。我的觀點是......你評論中「這種方式」的含義是什麼? – avaynshtok 2009-11-18 19:30:38

2

添加要求,資源定義可以讓你額外的參數傳遞

map.resources :jobs 
map.resource :account, :has_many => :jobs, :requirements => {:account => true} 

然後params[:account]如果路由將被設置url爲'http://www.mysite.tld/account/jobs',如果它是'http://www.mysite.tld/jobs',則取消設置'

與其他所有安靜路由一樣,操作取決於上下文。

  • GET請求沒有id路由到索引。
  • 與ID路線GET請求來顯示
  • POST請求路由創建
  • PUT請求路由更新
  • DELETE請求路由給毀了。