管理rails中的角色

时间:2016-05-11 17:40:49

标签: ruby-on-rails ruby roles

我想在我的项目中创建角色。每个用户可以是:admin,registered或demo。每个角色看到不同的东西。 我怎样才能做到这一点?做角色的最佳宝石是什么?

这是编程错误的一个例子"我想要的是什么:

  def index
    if current_user.role[:name] == 'admin'
      @installations = Installation.all
    elsif current_user.role[:name] == 'registered'
      @installations = current_user.installations
    elsif current_user.role[:name] == 'demo'
      @installations = current_user.installations.first
    else
    end
  end

4 个答案:

答案 0 :(得分:2)

您可以使用许多解决方案。

从宝石开始:

https://github.com/RolifyCommunity/rolify

https://github.com/martinrehfeld/role_model

使用Devise架构(如果您使用它):

https://github.com/plataformatec/devise/wiki/How-To:-Add-a-default-role-to-a-User

在rails 4中使用枚举:

class AddRolesToUser < ActiveRecord::Migration
  #add_column 'role', :integer, default: 0 to the users table
end

class User < ActiveRecord::Base
  enum role: [:demo, :admin, :registered]
end

这将启用角色方法。

user = User.find(1)
user.role #:demo
user.admin? #false
user.registered? #false

因此:

if user.admin?
  #somethig
elsif user.registered?
  #another something
else
  #another another something.

最后但并非最不重要的是,您所搜索的不是管理角色解决方案,而是管理权限解决方案:

https://github.com/ryanb/cancan

答案 1 :(得分:1)

可能对您有趣的一些宝石:

如果您决定自己实施,那么在某个页面中您可能想要更改内容,因为您可能希望执行以下操作:

使用迁移功能向用户模型添加角色:

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, default: :demo
  end
end

然后在您的应用中,您可以按如下方式使用它:

def index
  case current_user.role
    when :admin
      @installations = Installation.all
    when :registered
      @installations = current_user.installations
    else 
      @installations = current_user.installations.first
  end
end 

您也可以简单地创建一个布尔admin

您可能还想要在模型中创建一些方法,以便拨打current_user.admin?current_user.registered?。您可以这样做(如果您选择使用字符串来存储角色):

class User < ActiveRecord::Base
  def admin?
    self.role == "admin"
  end

  def registered?
    self.role == "registered"
  end
end

我看到将一个角色存储在一个字符串中的一个优点是,如果你有5个角色,那么你没有4个布尔值(就像你在布尔值中存储admin一样)而只有一个字符串。从长远来看,您可能希望实际存储role_id而不是字符串,并且具有单独的role模型。

Jorge de Los Santos(另一个答案)指出的一个很好的选择是使用枚举:

class User < ActiveRecord::Base
  enum role: [:demo, :admin, :registered]
end

这是一个很好的选择,因为它会自动添加上述方法,例如current_user.admin?,而无需对其进行硬编码。

使用您的角色,您可能需要执行一些授权(管理员可以访问特定页面,演示用户仅限于页面的子集等)。为此,您可以使用名为cancancan的gem。您可以查看this railscast以了解有关它的更多信息。此外,您可以在此处获得一些信息:How to use cancancan?

答案 2 :(得分:0)

在您的用户模型中添加一个布尔值:admin

class AddAdminToUsers < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, deafult: false
  end
end

为注册用户创建一种方法,将他们与演示用户分开,例如验证他们的电子邮件,提供家庭住址和电话号码,填写个人资料等。这取决于您,首先您需要决定注册用户和演示用户应该如何区别。

答案 3 :(得分:0)

CanCan gem会将授权添加到您的项目中,如果您想要实现具有不同功能的多个角色,这将非常有用。与[{1}}等身份验证系统一起使用时,您可以获得适用于您网站的全套功能。

您可以完全控制自己要定义的角色以及他们拥有的能力。 CanCan可以管理角色的跟踪,分配和查询,然后让您自己构建所需的内容。

你可以在Github找到CanCan gem:https://github.com/ryanb/cancan

使用简单,文档简单易懂。