微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

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

image of controller nesting for namespaced routes

这就是我的视图嵌套的方式。

Image of view nesting in relation to controller nesting above

这是我配置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

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

用户

类UserProfile

这里的任何帮助将不胜感激。不确定为什么会遇到此错误

谢谢。

解决方法

如果您进行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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?