冲突的设计和 restful 控制器路由 | Rails 5.2

Conflicting Devise and restful controller routes | Rails 5.2

我正在开发一个 Rails 5.2 项目,该项目使用 Devise 来管理 User 模型。我希望用户能够自行注册,并允许管理员代表他们创建帐户。我已经使用 Devise 设置了 User 模型,并为资源生成了作用域控制器(和视图)。这涵盖了自我注册方面,为了涵盖管理员发起的注册,我创建了一个 users_controller 作为标准 restful 控制器,并在路由中分别设置了资源路由.这似乎适用于除 users#create 操作路由与 devise_forusers/registrations#create 创建的路由冲突之外的所有内容(请参阅下面生成的路由)。这会导致 users#new 表单提交被 Devise users/registrations#create 而不是 users#create.

错误处理

使 *#create 路线独一无二的最佳方法是什么?

routes.rb

Rails.application.routes.draw do
  devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations' }

  resources :users
end

生成的路线

        new_user_session GET    /users/sign_in(.:format)        users/sessions#new
            user_session POST   /users/sign_in(.:format)        users/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)       users/sessions#destroy
       new_user_password GET    /users/password/new(.:format)   devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)  devise/passwords#edit
           user_password PATCH  /users/password(.:format)       devise/passwords#update
                         PUT    /users/password(.:format)       devise/passwords#update
                         POST   /users/password(.:format)       devise/passwords#create
cancel_user_registration GET    /users/cancel(.:format)         users/registrations#cancel
   new_user_registration GET    /users/sign_up(.:format)        users/registrations#new
  edit_user_registration GET    /users/edit(.:format)           users/registrations#edit
       user_registration PATCH  /users(.:format)                users/registrations#update
                         PUT    /users(.:format)                users/registrations#update
                         DELETE /users(.:format)                users/registrations#destroy
                         POST   /users(.:format)                users/registrations#create
---
                   users GET    /users(.:format)                users#index
                         POST   /users(.:format)                users#create
                new_user GET    /users/new(.:format)            users#new
               edit_user GET    /users/:id/edit(.:format)       users#edit
                    user GET    /users/:id(.:format)            users#show
                         PATCH  /users/:id(.:format)            users#update
                         PUT    /users/:id(.:format)            users#update
                         DELETE /users/:id(.:format)            users#destroy

像这样

devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations' }

devise_scope :user do
  post   '/users/create'  => 'users#create',  as: :create_user
  get   '/users'  => 'users#index',  as: :list_users
  get   '/users/:id' => 'users#show', as: :show_user
end

或者您可以在定义 resources :users, except: :create 时跳过 create action 并使用 registrations_controller create.

您可以configure the devise route有一个区分路径(即'auth')

routes.rb

Rails.application.routes.draw do
  devise_for :users, path: 'auth', controllers: { sessions: 'users/sessions', registrations: 'users/registrations' }
  resources :users
end

你需要this:

  devise_for :users, path: 'auth', controllers: {
    sessions: 'web/users/sessions',
    registrations: 'web/users/registrations'
  }