欢迎来到cool的博客
7

Music box

Click to Start

点击头像播放音乐
新博客链接

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支持三个选项:modulepathas

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_userscool_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

返回列表