在命名空间内设计
Posted
技术标签:
【中文标题】在命名空间内设计【英文标题】:Devise within namespace 【发布时间】:2011-05-28 21:46:01 【问题描述】:我正在尝试将我的 Rails 项目拆分为普通用户的前端和管理员的后端。因此,我创建了一个命名空间“管理员”,以便我可以在地图管理员中轻松控制管理员特定的控制器方法/布局/身份验证。
我仅使用 Devise 来注册/验证我的管理员。因为它仅用于管理员,所以我试图将 Devise 移动到管理员命名空间。
我在 Devise 的 documentation 中找不到我想要的东西,但我在 routes.rb 中尝试了类似的东西:
namespace 'admin'do
devise_for :admins
end
我也尝试制作一个自定义的 Devise::Sessions 控制器,但似乎也没有成功。
有人知道怎么做吗?我应该只使用常规路线来设计自定义(管理员)布局吗?
【问题讨论】:
【参考方案1】:如何指定要采用的路径,将其放在您的命名空间之外。
devise_for :users, path: 'admins'
这将生成以下路线
new_user_session GET /admins/sign_in(.:format) devise/sessions#new
user_session POST /admins/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /admins/sign_out(.:format) devise/sessions#destroy
user_password POST /admins/password(.:format) passwords#create
new_user_password GET /admins/password/new(.:format) passwords#new
edit_user_password GET /admins/password/edit(.:format) passwords#edit
PUT /admins/password(.:format) passwords#update
cancel_user_registration GET /admins/cancel(.:format) registrations#cancel
user_registration POST /admins(.:format) registrations#create
new_user_registration GET /admins/sign_up(.:format) registrations#new
edit_user_registration GET /admins/edit(.:format) registrations#edit
PUT /admins(.:format) registrations#updat
DELETE /admins(.:format) registrations#destroy
在这种情况下,您无需更改任何内容,如果这是您要查找的内容。
快乐编码:)
【讨论】:
【参考方案2】:将devise_for
方法移动到作用域中怎么样:
scope '/admin' do
devise_for :admins
end
使用命名空间,控制器将尝试寻找不存在的Admin::SessionController
。对于范围,它没有,所以应该可以工作。
【讨论】:
正是我所追求的,干杯! 只想将链接添加到有关向 Rails 路由添加范围的各种方法here【参考方案3】:如果你想把你的设计视图放在views/admin/admins/中,你的控制器放在controllers/admin/admins/中:
您在 controllers/admin/admins 中的 sessions_controller.rb:
class Admin::Admins::SessionsController < ::Devise::SessionsController
layout "admin/connection"
end
routes.rb:
namespace :admin do |admin|
devise_for :admins, :controllers => :sessions => "admin/admins/sessions"
end
生成设计视图:
rails g devise:views admin/admins
【讨论】:
【参考方案4】:Jack Chu 和 iain 解决方案都应该解决问题并生成视图以自定义登录表单的布局。
所以在你的config/routes.rb
中你应该有
scope '/subfolder' do
devise_for :admins, :controllers => :sessions => "subfolder/sessions"
end
namespace :subfolder do
match '/', :to => 'subcontroller#action'
end
请记住,您已经为会话创建了自己的控制器。
可能你也需要使用rails generate devise:views
来生成你的视图
Check this 对设计任务有任何疑问。
【讨论】:
【参考方案5】:除了 iain 答案的第一个解决方案之外,我还必须生成设计视图,否则它会引发模板丢失异常。
生成视图
rails g devise_views
视图将位于视图>设计中。将创建的地图“会话”移动到地图视图>管理员
【讨论】:
其实是rails generate devise:views
在旧版本中它曾经是devise_views
。 :)【参考方案6】:
简单地将设计“移动”到 admin 命名空间是错误的。 Devise 使用像 Devise::SessionsController
这样的控制器,并且不能“移动”。
我通常创建自己的控制器并从 Devise 继承它们:
class Admin::SessionsController < ::Devise::SessionsController
layout "admin"
# the rest is inherited, so it should work
end
并在config/routes.rb
中配置这个:
devise_for :admins, :controllers => :sessions => "admin/sessions"
或者你可以只改变布局,让布局更复杂一点:
class ApplicationController < ActionController::Base
layout :layout
private
def layout
if devise_controller? && devise_mapping.name == :admin
"admin"
else
"application"
end
end
end
【讨论】:
非常感谢您提供可理解的解决方案。我正在学习使用命名空间,所以您的第一个解决方案对我很有帮助。 没有必要继承每个设计控制器来设置自己的布局。您可以在 application.rb ***.com/a/11085724/1474934 中执行此操作以上是关于在命名空间内设计的主要内容,如果未能解决你的问题,请参考以下文章