Rails 6 - 命名空间中的嵌套资源问题

Rails 6 - Issue with nested resources in a namespace

所以我试图将资源嵌套在命名空间下,但是当我尝试导航到 UserProfile 新页面时,我遇到了以下错误:

ActionController::RoutingError at /users/xxxxxx/user_profiles/new
uninitialized constant AccountManagementPages::UserProfilesController
Did you mean?  AccountManagementPages::UsersController

我的 routes.rb 文件中的资源是这样设置的

  constraints(AccountManagement) do
    namespace :account_management_pages, path: '' do
      root to: 'users#new', as: :registration
      resources :users, except: %w[index], path_names: { new: 'register' } do
        resources :user_profiles
      end
    end
  end

我的控制器和视图的文件结构配置正确(至少我认为是这样)。

下面是我的视图是如何嵌套的。

这就是我 user_profiles_controller 配置的方式:

module AccountManagementPages
  module Users
    class UserProfilesController < ApplicationController

      def show; end

      def new; end

      def edit; end

      def create; end

      def update; end

    end
  end
end

和我的模特协会(不要认为这在这里过于相关,但以防万一。)

class 用户 < ApplicationRecord has_one :user_profile, 依赖: :destroy 结束

class UserProfile < ApplicationRecord belongs_to:用户 结束

如有任何帮助,我们将不胜感激。不确定为什么会遇到此错误?

提前致谢。

如果您这样做 rails routes,您将获得(除其他外):

                                 Prefix Verb   URI Pattern                                                        Controller#Action
          account_management_pages_registration GET    /                                                          account_management_pages/users#new
    account_management_pages_user_user_profiles GET    /users/:user_id/user_profiles(.:format)                    account_management_pages/user_profiles#index
                                                POST   /users/:user_id/user_profiles(.:format)                    account_management_pages/user_profiles#create
 new_account_management_pages_user_user_profile GET    /users/:user_id/user_profiles/register(.:format)           account_management_pages/user_profiles#new
edit_account_management_pages_user_user_profile GET    /users/:user_id/user_profiles/:id/edit(.:format)           account_management_pages/user_profiles#edit
     account_management_pages_user_user_profile GET    /users/:user_id/user_profiles/:id(.:format)                account_management_pages/user_profiles#show
                                                PATCH  /users/:user_id/user_profiles/:id(.:format)                account_management_pages/user_profiles#update
                                                PUT    /users/:user_id/user_profiles/:id(.:format)                account_management_pages/user_profiles#update
                                                DELETE /users/:user_id/user_profiles/:id(.:format)                account_management_pages/user_profiles#destroy
                 account_management_pages_users POST   /users(.:format)                                           account_management_pages/users#create
              new_account_management_pages_user GET    /users/register(.:format)                                  account_management_pages/users#new
             edit_account_management_pages_user GET    /users/:id/edit(.:format)                                  account_management_pages/users#edit
                  account_management_pages_user GET    /users/:id(.:format)                                       account_management_pages/users#show
                                                PATCH  /users/:id(.:format)                                       account_management_pages/users#update
                                                PUT    /users/:id(.:format)                                       account_management_pages/users#update
                                                DELETE /users/:id(.:format)                                       account_management_pages/users#destroy

如您所见,user_profiles 并未嵌套在 users 命名空间下。 Rails,因此,期望:

module AccountManagementPages
  class UserProfilesController < ApplicationController

    ...

  end
end

如果你这样做:

constraints(AccountManagement) do
  namespace :account_management_pages, path: '' do
    root to: 'users#new', as: :registration
    resources :users, except: %w[index], path_names: { new: 'register' } do
      scope module: :users do 
        resources :user_profiles
      end
    end
  end
end

...然后 rails routes,你得到(除其他外):

                                         Prefix Verb   URI Pattern                                                Controller#Action
          account_management_pages_registration GET    /                                                          account_management_pages/users#new
    account_management_pages_user_user_profiles GET    /users/:user_id/user_profiles(.:format)                    account_management_pages/users/user_profiles#index
                                                POST   /users/:user_id/user_profiles(.:format)                    account_management_pages/users/user_profiles#create
 new_account_management_pages_user_user_profile GET    /users/:user_id/user_profiles/register(.:format)           account_management_pages/users/user_profiles#new
edit_account_management_pages_user_user_profile GET    /users/:user_id/user_profiles/:id/edit(.:format)           account_management_pages/users/user_profiles#edit
     account_management_pages_user_user_profile GET    /users/:user_id/user_profiles/:id(.:format)                account_management_pages/users/user_profiles#show
                                                PATCH  /users/:user_id/user_profiles/:id(.:format)                account_management_pages/users/user_profiles#update
                                                PUT    /users/:user_id/user_profiles/:id(.:format)                account_management_pages/users/user_profiles#update
                                                DELETE /users/:user_id/user_profiles/:id(.:format)                account_management_pages/users/user_profiles#destroy
                 account_management_pages_users POST   /users(.:format)                                           account_management_pages/users#create
              new_account_management_pages_user GET    /users/register(.:format)                                  account_management_pages/users#new
             edit_account_management_pages_user GET    /users/:id/edit(.:format)                                  account_management_pages/users#edit
                  account_management_pages_user GET    /users/:id(.:format)                                       account_management_pages/users#show
                                                PATCH  /users/:id(.:format)                                       account_management_pages/users#update
                                                PUT    /users/:id(.:format)                                       account_management_pages/users#update
                                                DELETE /users/:id(.:format)                                       account_management_pages/users#destroy

...并且 user_profiles 将嵌套在 users 下。你应该可以使用:

module AccountManagementPages
  module Users
    class UserProfilesController < ApplicationController

      ...

    end
  end
end