在命名空间内设计

时间:2010-12-21 15:33:39

标签: ruby-on-rails namespaces ruby-on-rails-plugins devise

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

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

我无法在Devise的documentation中找到我想要的东西,但我在routes.rb中尝试了类似的东西:

namespace 'admin'do 
  devise_for :admins
end

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

有谁知道怎么做?我应该使用自定义(管理员)布局设计常规路线吗?

6 个答案:

答案 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 Chuiain解决方案都应解决问题并生成视图,以便自定义登录表单的布局。

所以在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