【问题标题】:Rails 6 - Issue with nested resources in a namespaceRails 6 - 命名空间中的嵌套资源问题
【发布时间】:2020-09-25 04:18:09
【问题描述】:

所以我试图在命名空间下嵌套资源,但是当我尝试导航到 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

和我的模型关联(不要认为这在这里过于相关,但只是以防万一。)

类用户

类用户配置文件

这里的任何帮助将不胜感激。不知道为什么我会遇到这个错误?

提前致谢。

【问题讨论】:

  • “rake routes | grep account_management_pages”怎么说?嵌套路由不需要嵌套文件夹结构。命名空间通常可以,但可以通过指定路径、控制器等来管理。
  • @razvans 它是控制器.. 大声笑.. 我不知道我是如何忽略在路由文件中命名控制器的.. 大声笑.. 谢谢!我已经盯着那个太久了!

标签: ruby-on-rails rails-routing


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多