Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 角色屏蔽在rails中是如何工作的_Ruby On Rails_Authorization_Roles - Fatal编程技术网

Ruby on rails 角色屏蔽在rails中是如何工作的

Ruby on rails 角色屏蔽在rails中是如何工作的,ruby-on-rails,authorization,roles,Ruby On Rails,Authorization,Roles,按照railscasts教程设置我的应用程序。就像我添加的教程一样 t.Integer :roles_mask “我的用户”表和“我的模型” class User < ApplicationRecord ROLES = %w[admin moderator author] def roles= (roles) self.roles_mask = (roles & ROLES).map { |r| 2** ROLES.index(r) }.sum

按照railscasts教程设置我的应用程序。就像我添加的教程一样

t.Integer :roles_mask
“我的用户”表和“我的模型”

class User < ApplicationRecord

    ROLES = %w[admin moderator author]

    def roles= (roles)
        self.roles_mask = (roles & ROLES).map { |r| 2** ROLES.index(r) }.sum
    end

    def roles
        ROLES.reject { |r| ((roles_mask || 0) & 2** ROLES.index(r)).zero? }
    end

    def role_symbols
        roles.map(& :to_sym )
    end
end
class用户

使用表单添加和删除角色,一切都很好。但是如何从控制台实现这一点呢?它到底是如何工作的,rails是如何从整数值中识别字符串角色的?

Ahaa!我最喜欢的逻辑!这是位的魔力。在机器语言中,所有内容都以0和1(0-1)表示。现在回到角色上来

ROLES = %w[admin moderator author]
对于模型中指定的每个角色,它分配一个位

admin moderator author 
1     1         1
对于一个用户来说,如果你给他这个角色,这个位就变成
1
else
0

u = User.new
u.roles = [:admin]
u.admin? #=> true
u.roles_mask #=> 1
admin moderator author 
1     0         0
# Read it in reverse as 0 0 1 which in binary means 1. That's why roles_mask is 1
u.roles << :author
u.roles_mask #=> 5
admin moderator author 
1     0         1
# Read it as 1 0 1 which in binary means 5. That's why roles_mask is 5
u=User.new
u、 角色=[:admin]
u、 管理员?#=>真的
u、 角色掩码#=>1
管理员版主作者
1     0         0
#将其反向读取为0 1,二进制表示1。这就是为什么角色的面具是1
u、 角色5
管理员版主作者
1     0         1
#把它读成1 0 1,二进制表示5。这就是为什么角色的面具是5
所以,它只是一个小小的魔法,并没有其他东西可以维护角色分配:)阅读更多关于二进制到十进制转换的信息

如果您看到gem的角色,它会提到:

#声明有效角色--如果添加更多角色,请不要更改顺序
#角色之后,始终在末尾附加它们

这正是提到的季节。如果更改顺序,持久值为
1
的用户将不知道您做了什么