在命名空间内设计

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 中执行此操作

以上是关于在命名空间内设计的主要内容,如果未能解决你的问题,请参考以下文章

C++命名空间

如何在另一个 C++ 命名空间内的全局命名空间中定义朋友?

static关键字在命名空间范围内没用吗?

不同命名空间内的类的循环依赖 C++

如何防止从命名空间内访问类?

获取命名空间内的所有类[重复]