确定路线
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 的嵌套部分。