確定路線

Rails 提供了幾種組織路由的方法。

網址範圍

scope 'admin' do
  get 'dashboard', to: 'administration#dashboard'
  resources 'employees'
end

這會生成以下路由

get       '/admin/dashboard',          to: 'administration#dashboard'
post      '/admin/employees',          to: 'employees#create'
get       '/admin/employees/new',      to: 'employees#new'
get       '/admin/employees/:id/edit', to: 'employees#edit'
get       '/admin/employees/:id',      to: 'employees#show'
patch/put '/admin/employees/:id',      to: 'employees#update'
delete    '/admin/employees/:id',      to: 'employees#destroy'

在伺服器端,將一些檢視儲存在不同的子資料夾中,將管理檢視與使用者檢視分開可能更有意義。

範圍按模組

scope module: :admin do
  get 'dashboard', to: 'administration#dashboard'
end

module 在給定名稱的子資料夾下查詢控制器檔案

get       '/dashboard',          to: 'admin/administration#dashboard'

你可以通過新增 as 引數來重新命名路徑助手字首

scope 'admin', as: :administration do
  get 'dashboard'
end

# => administration_dashboard_path

使用 namespace 方法,Rails 提供了一種方便的方法來完成上述所有操作。以下宣告是等效的

namespace :admin do
end

scope 'admin', module: :admin, as: :admin

控制範圍

scope controller: :management do
  get 'dashboard'
  get 'performance'
end

這會生成這些路線

get       '/dashboard',          to: 'management#dashboard'
get       '/performance',        to: 'management#performance'

淺巢狀

資源路由接受:shallow 選項,有助於儘可能縮短 URL。資源不應巢狀多個深度級別。避免這種情況的一種方法是建立淺路線。目標是將父集合 URL 段留在不需要它們的位置。最終結果是生成的唯一巢狀路由是針對:index:create:new 操作。其餘的儲存在他們自己的淺層 URL 上下文中。自定義淺路徑的範圍有兩個選項:

  • :shallow_path :使用指定引數對成員路徑進行字首

    scope shallow_path: "sekret" do
      resources :articles do
        resources :comments, shallow: true
      end
    end
    
  • :shallow_prefix :將指定的引數新增到命名助手

    scope shallow_prefix: "sekret" do
      resources :articles do
        resources :comments, shallow: true
      end
    end
    

我們還可以通過以下方式說明 shallow 路線:

resources :auctions, shallow: true do
  resources :bids do
   resources :comments
  end
end 

或者如下編碼(如果你是快樂的話):

resources :auctions do
 shallow do
   resources :bids do
     resources :comments
   end
 end
end

產生的路線是:

字首 動詞 URI 模式
bid_comments 得到 /bids/:bid_id/comments(.:format)
POST /bids/:bid_id/comments(.:format)
new_bid_comment 得到 /bids/:bid_id/comments/new(.:format)
edit_comment 得到 /comments/:id/edit(.:format)
評論 得到 /comments/:id(.:format)
補丁 /comments/:id(.:format)
/comments/:id(.:format)
刪除 /comments/:id(.:format)
auction_bids 得到 /auctions/:auction_id/bids(.:format)
POST /auctions/:auction_id/bids(.:format)
new_auction_bid 得到 /auctions/:auction_id/bids/new(.:format)
edit_bid 得到 /bids/:id/edit(.:format)
出價 得到 /bids/:id(.:format)
補丁 /bids/:id(.:format)
/bids/:id(.:format)
刪除 /bids/:id(.:format)
拍賣 得到 /auctions(.:format)
POST /auctions(.:format)
new_auction 得到 /auctions/new(.:format)
edit_auction 得到 /auctions/:id/edit(.:format)
拍賣 得到 /auctions/:id(.:format)
補丁 /auctions/:id(.:format)
/auctions/:id(.:format)
刪除 /auctions/:id(.:format)

如果仔細分析生成的路由,你會注意到只有在需要確定要顯示的資料時才會包含 URL 的巢狀部分。