我试图弄清楚如何在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。它没有用 - 我得到同样的错误。
任何人都可以看到我做错了吗?
答案 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。但是,在打破它们之前先了解它们,它们实际上非常聪明。
请注意,您的路线不会影响控制器查看视图的方式。这就是模块嵌套 - 这就是对象的组成方式。并且与嵌套路由的概念完全无关。
您生成的路线不是嵌套的。嵌套路线例如是:
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