0

我正在使用 devise 和 cancan 进行用户身份验证和权限。我只需要为任何新用户创建一组默认权限。我不想弄乱设计代码,所以它应该在我的用户模型中。最好的方法是什么。

好的,这是我在模型中尝试的:

before_create :setup_permissions

    def setup_permissions 
    permissions = []
        @roles = Role.where('subject_id is null and permissions = ?', 'Read')
            @roles.each do |role|
            permissions << {:role_id => role.id}
            end
        self.role_assignments_attributes = permissions  
    end

但是上面的代码给出了一个错误。

有趣的是,我在控制台中逐行运行代码以从上面构建权限。它产生正确的数组,如下所示。

permissions =  [{:role_id=>15}, {:role_id=>17}, {:role_id=>19}, {:role_id=>21}, {:role_id=>23}, {:role_id=>25}, {:role_id=>27}]

当我将权限数组直接粘贴到模型中而不是构建它时,它可以工作,如下所示:

def setup_permissions 
permissions =  [{:role_id=>15}, {:role_id=>17}, {:role_id=>19}, {:role_id=>21}, {:role_id=>23}, {:role_id=>25}, {:role_id=>27}]

    @roles = Role.where('subject_id is null and permissions = ?', 'Read')
        @roles.each do |role|
        permissions << {:role_id => role.id}
        end
    self.role_assignments_attributes = permissions  
   end
4

2 回答 2

0

after_create为您的用户模型添加一个钩子。

after_create :setup_permissions

def setup_permissions
  #Do what you need to do here
end
于 2012-11-27T23:34:47.393 回答
0

我通过在 Model.where() 末尾添加 .to_a 将其转换为数组来使其工作。当您使用 Model.where() 子句而不是在 Model.find(id) 的情况下使用 Array 时,Rails 返回一个 ActiveRecord::Relationship。这应该在这两种情况下更正并使其相似。

before_create :setup_permissions
    def setup_permissions 
    permissions = []
        @roles = Role.where('subject_id is null and permissions = ?', 'Read').to_a
            @roles.each do |role|
            permissions << {:role_id => role.id}
            end         
       end
于 2012-11-28T02:19:21.940 回答