Rails 5 - 嵌套路由 - 控制器的未初始化常量

时间:2016-10-07 23:30:33

标签: ruby-on-rails ruby routes nested-routes

我试图弄清楚如何在Rails 5中嵌套路由(以便相关的控制器保持在一起。

我将控制器文件树设置为:

 app/controllers/users

在该文件夹中,我有控制器:

identities_controller.rb
app_roles_controller.rb

每个控制器都保存为:

class Users::IdentitiesController < ApplicationController
class Users::AppRolesController < ApplicationController

我的路线档案有:

resources :app_roles,
    :controllers => {
      :app_roles => 'users/app_roles'
    }

  devise_for :users,
             :controllers => {
                :sessions => 'users/sessions',
                :registrations => "users/registrations",
                :omniauth_callbacks => 'users/omniauth_callbacks'
              }

  resources :identities, 
    :controllers => {
        :identities => 'users/identities'
    }

  resources :users

在我的views文件夹中,所有文件都是顶级文件。我不清楚我是否需​​要按照与控制器相同的方式对它们进行分组。

当我保存所有内容并尝试导航到http://localhost:3000/app_roles#index时,我希望转到我的app / views / app_roles / index。

相反,我收到的错误是:

app_roles
uninitialized constant AppRolesController

当我耙路线时,我得到:

rake routes | grep app_roles
                       app_roles GET      /app_roles(.:format)                    app_roles#index {:controllers=>{:app_roles=>"users/app_roles"}}
                                 POST     /app_roles(.:format)                    app_roles#create {:controllers=>{:app_roles=>"users/app_roles"}}
                    new_app_role GET      /app_roles/new(.:format)                app_roles#new {:controllers=>{:app_roles=>"users/app_roles"}}
                   edit_app_role GET      /app_roles/:id/edit(.:format)           app_roles#edit {:controllers=>{:app_roles=>"users/app_roles"}}
                        app_role GET      /app_roles/:id(.:format)                app_roles#show {:controllers=>{:app_roles=>"users/app_roles"}}
                                 PATCH    /app_roles/:id(.:format)                app_roles#update {:controllers=>{:app_roles=>"users/app_roles"}}
                                 PUT      /app_roles/:id(.:format)                app_roles#update {:controllers=>{:app_roles=>"users/app_roles"}}
                                 DELETE   /app_roles/:id(.:format)                app_roles#destroy {:controllers=>{:app_roles=>"users/app_roles"}}

对我而言,我认为这些路线显示app_roles #index应通过app / controllers / users / app_roles_controller.rb中的控制器转到app / views / app_roles / index.html.erb

我对身份资源有同样的问题。

猜测 我尝试将app / views / app_roles文件夹移动到嵌套在users文件夹下(即app / views / users),但是当我尝试转到http://localhost:3000/app_roles#index检查它是否有效时,我收到了同样的错误

我还尝试将routes文件修改为:

resources :app_roles,
        :resources => {
          :app_roles => 'users/app_roles'
        }

由此,我的意思是我将引用更改为:controllers,to:resources。它没有用 - 我得到同样的错误。

任何人都可以看到我做错了吗?

1 个答案:

答案 0 :(得分:0)

路由到命名空间控制器

将资源路由到&#34;命名空间&#34;控制器,您可以使用module选项:

resources :identities, module: :users

scope module:在声明多个资源时很有用:

scope module: :users do
  resources :app_roles, module: :users
  resources :identities, module: :users
end

这比手动指定控制器要干净得多,这实际上只有当你覆盖像Devise这样的库或控制器和路由名称没有排队时才会完成。

这里的术语可能有点令人困惑。请记住,路由唯一能做的就是将传入的请求与控制器进行匹配。它不会影响控制器的工作方式。

查看视图

  

对我而言,我认为这些路线显示app_roles #index应该转到   app / views / app_roles / index.html.erb通过控制器进入   应用程序/控制器/用户/ app_roles_controller.rb

那不是它的工作方式。 Rails根据控制器类的嵌套查找视图。因此,rails会在Users::IdentitiesController中查找views/users/indentities/的观看次数。

如果您希望打破约定,可以显式呈现视图或prepend/append the view paths。但是,在打破它们之前先了解它们,它们实际上非常聪明。

请注意,您的路线不会影响控制器查看视图的方式。这就是模块嵌套 - 这就是对象的组成方式。并且与嵌套路由的概念完全无关。

&#34;命名空间&#34;和嵌套路线

您生成的路线不是嵌套的。嵌套路线例如是:

POST /users/:user_id/identities

其中清楚地描述了意图。要设置indentities的嵌套路由,您可以执行以下操作:

resources :users, shallow: true do
  scope module: :users do
    resources :identities
  end
end

shallow: true生成没有users/:used_id/前缀的单个路由。

           Prefix Verb   URI Pattern                              Controller#Action
  user_identities GET    /users/:user_id/identities(.:format)     users/identities#index
                  POST   /users/:user_id/identities(.:format)     users/identities#create
new_user_identity GET    /users/:user_id/identities/new(.:format) users/identities#new
    edit_identity GET    /identities/:id/edit(.:format)           users/identities#edit
         identity GET    /identities/:id(.:format)                users/identities#show
                  PATCH  /identities/:id(.:format)                users/identities#update
                  PUT    /identities/:id(.:format)                users/identities#update
                  DELETE /identities/:id(.:format)                users/identities#destroy
            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