我想在我的项目中创建角色。每个用户可以是: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
答案 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.
最后但并非最不重要的是,您所搜索的不是管理角色解决方案,而是管理权限解决方案:
答案 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
使用简单,文档简单易懂。