Rails 5路由:scope and namespace
https://devblast.com/b/rails-5-routes-scope-vs-namespace
你可能想知道的区别scope
,并namespace
为您的Rails应用程序的路由。了解差异非常重要,因为它们会影响资源和控制器的路径。
namespace
这是一个简单的选择。使用时namespace
,它将为指定资源的URL路径添加前缀,并尝试在名称与命名空间相同的模块下找到控制器。
使用routes.rb
文件中的以下代码,
namespace :admin do
resources :users
end
您最终会得到以下路线:
Prefix Verb URI Pattern Controller#Action
admin_users GET /admin/users(.:format) admin/users#index
POST /admin/users(.:format) admin/users#create
admin_user GET /admin/users/:id(.:format) admin/users#show
PATCH /admin/users/:id(.:format) admin/users#update
PUT /admin/users/:id(.:format) admin/users#update
DELETE /admin/users/:id(.:format) admin/users#destroy
如您所见,admin
作为URI路径(/admin/users
)中的前缀和包含控制器(admin/users#index
)的模块添加。使用此代码,Rails将Admin::UsersController
位于app/controllers/admin/users_controller.rb
。
scope
scope
有点复杂 - 但优点是它为您提供了更多选项来精确调整您想要做的事情。
没有选择
在scope
没有任何选项且仅使用范围名称的情况下使用时,它只会更改资源路径。
# routes.rb
scope :admin do
resources :users
end
以下是生成的路线:
Prefix Verb URI Pattern Controller#Action
users GET /admin/users(.:format) users#index
POST /admin/users(.:format) users#create
user GET /admin/users/:id(.:format) users#show
PATCH /admin/users/:id(.:format) users#update
PUT /admin/users/:id(.:format) users#update
DELETE /admin/users/:id(.:format) users#destroy
如您所见,之前/admin
已添加为前缀/users
,但users
控制器不必位于任何模块内。
选项
scope
支持三个选项:module
,path
和as
。
module
module
让我们定义嵌入式资源的控制器将驻留在哪个模块中。
scope module: 'admin' do
resources :users
end
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) admin/users#index
POST /users(.:format) admin/users#create
user GET /users/:id(.:format) admin/users#show
PATCH /users/:id(.:format) admin/users#update
PUT /users/:id(.:format) admin/users#update
DELETE /users/:id(.:format) admin/users#destroy
path
path
允许我们在资源名称之前设置将出现在URI中的前缀。
scope module: 'admin', path: 'fu' do
resources :users
end
Prefix Verb URI Pattern Controller#Action
users GET /fu/users(.:format) admin/users#index
POST /fu/users(.:format) admin/users#create
user GET /fu/users/:id(.:format) admin/users#show
PATCH /fu/users/:id(.:format) admin/users#update
PUT /fu/users/:id(.:format) admin/users#update
DELETE /fu/users/:id(.:format) admin/users#destroy
as
最后,as
可以用来更改用于标识资源的路径方法的名称。
scope module: 'admin', path: 'fu', as: 'cool' do
resources :users
end
在这种情况下,我们现在有cool
路径名称的前缀cool_users
和cool_user
。
Prefix Verb URI Pattern Controller#Action
cool_users GET /fu/users(.:format) admin/users#index
POST /fu/users(.:format) admin/users#create
cool_user GET /fu/users/:id(.:format) admin/users#show
PATCH /fu/users/:id(.:format) admin/users#update
PUT /fu/users/:id(.:format) admin/users#update
DELETE /fu/users/:id(.:format) admin/users#destroy