在这里的优秀系列文章中:http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/comment-page-2/#comment-908他解释了一些关于如何使用设计用于auth和cancan的权限。我有一个看起来更简单的问题(所以这些文章中省略了它):
我应该在哪里定义符号,例如:super_admin,以便它们可以被Ability类访问?这些定义应该如何看待?
我很确定这些定义属于Role类,但如果是,那么它们如何在Ability类中可用(范围内)简单:super_admin?
答案 0 :(得分:2)
您可以将符号视为有效字符串,类似于常量。你没有明确地定义它们,你只是使用它们 - 这可能是你感到困惑的地方。此外,由于您“只使用”符号,因此它们没有范围。如果您将符号输入错误为:duper_admin
,那么就没有错误检查,因为红宝石会很乐意为您创建该符号。
在文章中,作者正在roles
表中定义角色。那么如何将数据库中的角色与角色符号(如:super_admin
)进行比较?通过使用此方法
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
它是这样使用的
if user.role? :super_admin
can :manage, :all
...
role?
方法只是将符号转换为字符串,以便可以将其与数据库中的值进行比较。 roles
表与正在使用的符号之间没有编程映射。它们只是手动保持同步。
答案 1 :(得分:0)
符号的要点是ruby解释器只为每个符号创建一个副本。如果在一个ruby文件中编写:foo
,它将与所有其他ruby文件中的所有其他:foo
相同。您不必提前定义或声明符号。