我正在尝试将我的rails项目拆分为常规用户的前端和管理员的后端。因此我创建了一个命名空间“admin”,以便我可以在地图管理员中轻松控制管理员特定的控制器方法/布局/身份验证。
我正在使用Devise来注册/验证我的管理员。因为它仅用于管理员,所以我试图将Devise移动到管理员命名空间。
我无法在Devise的documentation中找到我想要的东西,但我在routes.rb中尝试了类似的东西:
namespace 'admin'do
devise_for :admins
end
我也尝试制作一个自定义的Devise :: Sessions控制器,但这似乎也没有用。
有谁知道怎么做?我应该使用自定义(管理员)布局设计常规路线吗?
答案 0 :(得分:38)
简单地“移动”Devise到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
答案 1 :(得分:21)
如何将devise_for
方法移动到范围中
scope '/admin' do
devise_for :admins
end
使用命名空间,控制器将尝试查找不存在的Admin::SessionController
。有了范围,它没有,所以应该工作。
答案 2 :(得分:11)
如何指定设计路径,将其置于命名空间之外。
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
如果您正在寻找,那么您无需更改任何内容。
快乐编码:)
答案 3 :(得分:5)
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对设计任务有任何疑问。
答案 4 :(得分:1)
如果你想把你的设计视图放在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
答案 5 :(得分:0)
除了iain的答案的第一个解决方案,我必须生成设计的视图,否则它会抛出一个模板缺少异常。
使用
生成视图rails g devise_views
视图将位于视图&gt;设计中。将创建的地图“会话”移动到地图视图&gt; admin