确定路线

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 的嵌套部分。