【问题标题】:How to maintain both admin and user with devise gem?(Rails 4)如何使用 devise gem 维护管理员和用户?(Rails 4)
【发布时间】:2015-08-30 07:52:30
【问题描述】:

我正在使用带有 devise gem 的 rails 4 并按照这篇文章 -“https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-Role”,我还为管理员创建了一个模型。现在我有管理员和用户模型。如何在 application_helper 中获取 current_admin,这些都存在:-

def resource_name
 :user
end

def resource
 @resource ||= User.new
end

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

请帮助管理一个管理员会话。提前致谢

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

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

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

    其中映射是角色类型。 *

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

    current_admin
    

    如果这不起作用,我建议检查以确保该设计已在 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 for OSX 上运行,因此它绝不是经过高度优化的) 有 1000 个用户记录,其中只有 2 个用户将“isAdmin”设置为 true。

    使用 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.)
    

    这绝不是一个非常彻底的例子——它只是为了提供一个关于像这样使用时的最小差异的想法。 Active Record 可能会稍微快一点/慢一点,但我无法想象它与上面的结果会有太大的不同。

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

    Active Record 迁移 (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)
    

    【讨论】:

    • 感谢您的回复。所以,我只需要使用 current_admin ......不需要其他任何东西来完成它。你会建议我合并两个表吗?我让用户和管理员分别认为用户无论如何都会增加,因此与制作不同的管理员模型相比,从增加的用户表中搜索管理员 ID 并不好。我该怎么办?以后会不会出问题?
    • 技术上将管理用户和标准用户存储在两个不同的表中可能会产生稍微更快的执行时间,但它很可能可以忽略不计。我在我的答案中添加了一个解释,概述了这个和一个例子。 :)
    • 非常感谢您的解释 :) 我还将保留一个具有管理员属性的用户表 :) :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多