1

在这里的优秀系列文章中:http ://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/comment-page-2/#comment -908他解释了一点关于如何使用 devise 进行 auth 和 cancan 获得权限。我有一个看起来简单得多的问题(因此这些文章中省略了它):

我应该在哪里定义诸如 :super_admin 这样的符号,以便能力类可以访问它们?这些定义应该如何看待?

我很确定这些定义属于 Role 类,但如果是这样,它们在 Ability 类中如何(在范围内)简单地使用 :super_admin ?

4

2 回答 2

2

您可以将符号视为类似于常量的有效字符串。你没有明确定义它们,你只是使用它们——这可能是你感到困惑的地方。此外,由于您“仅使用”符号,因此它们没有范围。如果您输入错误的符号,:duper_admin则不会对其进行错误检查,因为 ruby​​ 会很乐意为您创建该符号。

在文章中,作者在一个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在表和所使用的符号之间没有进行编程映射。它们只是手动保持同步。

于 2012-08-20T02:43:30.717 回答
0

符号的要点是 ruby​​ 解释器只为每个符号创建一个副本。如果您写入:foo一个 ruby​​ 文件,它将与:foo所有其他 ruby​​ 文件中的所有其他文件相同。您不必提前定义或声明符号。

于 2012-08-20T02:10:05.407 回答