如何使用设计宝石维护管理员和用户?(Rails 4)

时间:2015-08-30 07:52:31

标签: ruby-on-rails devise

我正在使用带有设计宝石的rails 4并遵循这篇文章 - “https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-Role”,我也为admin创建了一个模型。现在我有管理员和用户模型。如何在application_helper中获取current_admin,它们存在: -

def resource_name
 :user
end

def resource
 @resource ||= User.new
end

def devise_mapping
 @devise_mapping ||= Devise.mappings[:user]
end

请帮助主要管理员会话。提前致谢

1 个答案:

答案 0 :(得分:3)

Devise的current_X辅助方法定义如下:

def current_#{mapping}
        @current_#{mapping} ||= warden.authenticate(scope: :#{mapping})
      end

其中mapping是角色类型。 *

因此,您应该能够使用以下方式访问当前的管理员:

current_admin

如果这不起作用,我建议检查以确保在管理模型上正确设置了设备,如下所示:

class Admin < ActiveRecord::Base
    devise :database_authenticatable # additional attributes, i.e. :trackable, :lockable 
end

*来源:https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb

的第106行

<小时/> 如果您仍然遇到此问题,可能值得重新考虑您是否需要将管理员和用户分开使用不同的模型,而不是通过向用户添加管理属性来简化模型和实现模型。

<小时/> 修改

为了让您了解有多少可忽略的性能差异,可以查询管理用户的单个用户表与有两个表,我播种了一个MySQL数据库(在XAMPP上运行OSX,所以它绝不是大大优化的)有1000个用户记录,只有2个用户拥有&#39; isAdmin&#39;设为真。

使用SQL查询(从1000个用户池中选择管理员):

SELECT * FROM `users` WHERE isAdmin = 1 

结果:

Showing rows 0 - 1 (2 total, Query took 0.0004 seconds.)


使用SQL查询(从Admin表中选择Admins):

SELECT * FROM `administrators` 

结果:

Showing rows 0 - 16 (17 total, Query took 0.0003 seconds.)

这绝不是一个非常彻底的例子 - 它只是提供一个关于这样使用时的最小差异的想法。活动记录可能会稍微快一点,但我无法想象它与上述结果会有太大不同。

就个人而言,我发现更容易添加“isAdmin”#39; (或类似)属性到我的用户模型,如下所示:

Active Record migration(db \ migrate \ TIMESTAMP_create_users.rb)

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
       t.string :username
       t.boolean :isAdmin, default: false
        ...
    end
  end
end

然后在用户和管理员之间进行过滤,如下所示:

用户,管理员除外

users = User.where(:isAdmin => false)

所有用户

allUsers = User.all

仅限管理员

admins = User.where(:isAdmin => true)