在命名空间内设计

Har*_*Wit 37 namespaces ruby-on-rails ruby-on-rails-plugins devise

我正在尝试将我的rails项目拆分为普通用户的前端和管理员的后端.因此,我创建了一个名称空间"admin",以便我可以在地图管理员中轻松控制管理员特定的控制器方法/布局/身份验证.

我正在使用Devise来注册/验证我的管理员.因为它仅用于管理员,所以我试图将Devise移动到管理员命名空间.

我无法在Devise 的文档中找到我正在寻找的内容,但我在routes.rb中尝试过类似的内容:

namespace 'admin'do 
  devise_for :admins
end
Run Code Online (Sandbox Code Playgroud)

我也尝试制作一个自定义的Devise :: Sessions控制器,但这似乎也没有成功.

有谁知道如何做到这一点?我应该使用自定义(管理员)布局的常规路线设计吗?

iai*_*ain 40

简单地"移动"Devise到admin命名空间是错误的.Devise使用类似的控制器Devise::SessionsController,不能"移动".

我通常创建自己的控制器并从Devise继承它们:

class Admin::SessionsController < ::Devise::SessionsController
  layout "admin"
  # the rest is inherited, so it should work
end
Run Code Online (Sandbox Code Playgroud)

并在config/routes.rb以下配置:

devise_for :admins, :controllers => { :sessions => "admin/sessions" }
Run Code Online (Sandbox Code Playgroud)

或者您可以通过使布局更复杂来更改布局:

class ApplicationController < ActionController::Base

  layout :layout

  private

  def layout
    if devise_controller? && devise_mapping.name == :admin
      "admin"
    else
      "application"
    end
  end

end
Run Code Online (Sandbox Code Playgroud)


Jac*_*Chu 24

如何将devise_for方法移动到范围中:

scope '/admin' do
  devise_for :admins
end
Run Code Online (Sandbox Code Playgroud)

使用命名空间,控制器将尝试寻找不Admin::SessionController存在的命名空间.有范围它没有,所以应该工作.


Ron*_*ain 14

如何指定设计路径,将其放在命名空间之外.

devise_for :users, path: 'admins'
Run Code Online (Sandbox Code Playgroud)

这将生成以下路由

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
Run Code Online (Sandbox Code Playgroud)

如果这是您正在寻找的,那么您不必在这种情况下进行任何更改.

快乐编码:)


小智 5

无论杰克楚伊恩解决方案要解决这个问题再加以定制登录表单的布局产生你的意见.

所以,config/routes.rb你应该拥有

scope '/subfolder' do
   devise_for :admins, :controllers => { :sessions => "subfolder/sessions" }
end

namespace :subfolder do
  match '/', :to => 'subcontroller#action'
end
Run Code Online (Sandbox Code Playgroud)

请记住,为您正在进行的会话创建自己的控制器.也许你需要通过使用来生成你的观点rails generate devise:views

检查这个有关设计任务的任何疑问.