Rails 6 — проблема с вложенными ресурсами в пространстве имен

Итак, я пытаюсь вложить ресурсы в пространство имен, однако, когда я пытаюсь перейти на новую страницу 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

и мои ассоциации с моделями (не думаю, что это слишком уместно здесь, но на всякий случай).

класс User ‹ ApplicationRecord has_one :user_profile, зависимый: :destroy end

класс UserProfile ‹ ApplicationRecord принадлежит_кому: конец пользователя

любая помощь здесь будет принята с благодарностью. Не уверен, почему я нажимаю эту ошибку?

Заранее спасибо.


person Shawn Wilson    schedule 25.09.2020    source источник
comment
Что значит разгребать маршруты | grep account_management_pages говорите? Вложенные маршруты не требуют вложенной структуры папок. Обычно используется пространство имен, но этим можно управлять, указав путь, контроллер и т. д.   -  person razvans    schedule 25.09.2020
comment
@razvans это был контроллер .. лол .. я не знаю, как я проглядел имя контроллера в файле маршрутов .. лол .. спасибо! Я смотрел на это слишком долго!   -  person Shawn Wilson    schedule 25.09.2020


Ответы (1)


Если вы сделаете 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
person jvillian    schedule 25.09.2020