Rails 5 - 带路由的嵌套控制器

时间:2016-10-04 02:59:25

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

我正在尝试在Rails 5中创建一个应用程序。

为了保持文件结构整洁,我正在尝试在我的控制器目录中创建文件夹,我可以使用它来分组类似的资源。

例如,我有:

 app/controllers/users/users_controller.rb

然后,我可以将会话控制器嵌套在控制器/用户控制器中,以便与用户相关的所有资源都分组在用户文件夹下。

我因为路线文件怎么办而陷入困境。

当我耙路线时,我可以看到:

 users#index {:controllers=>{:users=>"users/users"}}
                                 POST     /users(.:format)                        users#create {:controllers=>{:users=>"users/users"}}
                        new_user GET      /users/new(.:format)                    users#new {:controllers=>{:users=>"users/users"}}
                       edit_user GET      /users/:id/edit(.:format)               users#edit {:controllers=>{:users=>"users/users"}}
                            user GET      /users/:id(.:format)                    users#show {:controllers=>{:users=>"users/users"}}
                                 PATCH    /users/:id(.:format)                    users#update {:controllers=>{:users=>"users/users"}}
                                 PUT      /users/:id(.:format)                    users#update {:controllers=>{:users=>"users/users"}}
                                 DELETE   /users/:id(.:format)                    users#destroy {:controllers=>{:users=>"users/users"}}

在我的路线文件中,我尝试了一些事情(如下所示) - 它们都不起作用:

Rails.application.routes.draw do
  devise_for :users,
             :controllers => {
                :sessions => 'users/sessions',
                :registrations => "users/registrations",
                :omniauth_callbacks => 'users/omniauth_callbacks'
              }

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


  resources :users do
  scope module: :users do
    resources :users
    end
    end 

  root 'home#index'

end

我也尝试过:

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

每一次,我都会收到错误消息:

ActionController::RoutingError at /users
uninitialized constant UsersController

我不知道我需要做些什么才能让它发挥作用。我已经更改了嵌套在controllers / users文件夹中的每个控制器,前缀为:

 Users:: 

任何人都可以看到如何设置它,以便我可以整洁地保存我的文件吗?

注意:我没有在models文件夹中创建相同的文件目录结构。我想 - 但我担心我无法为控制器弄清楚这一点。谁能看到我做错了什么?

2 个答案:

答案 0 :(得分:3)

我建议您将实际的users_controller放在基本控制器目录中,并且只将嵌套控制器放在users目录中(即遵循与嵌套相同的结构)。

另一种方法是将users_controller命名为rails预期的,即在Users模块中:

module Users
  class UsersController < ApplicationController
     ...

然后引用它:Users::UsersController 我总觉得名字中的重复有点麻烦,而且更喜欢顶层控制器只是在基本目录中。

答案 1 :(得分:2)

我也非常喜欢这个视频中解释的方法:

https://youtu.be/1B0Vioz4Ukw

基本上他为每个模块创建BaseController,从ApplicationController继承,然后相关控制器直接从相应的BaseController继承。