我在哪里定义符号以便在另一个模型中可以访问它们?

时间:2012-08-20 02:06:31

标签: ruby-on-rails devise ruby-on-rails-3.2 cancan

在这里的优秀系列文章中: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?

2 个答案:

答案 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相同。您不必提前定义或声明符号。