2012-11-27 109 views
0

我正在使用devise和cancan進行用戶身份驗證和權限。我需要爲任何NEW用戶創建一組默認的權限。我不想弄亂設計代碼,所以它應該在我的用戶模型中。什麼是最好的方式來做到這一點。在創建用戶時分配默認權限

確定這裏就是我在我的模型的嘗試:

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 

回答

0

我通過在Model.where()的末尾添加.to_a來將其轉換爲數組來實現它。當您在Model.find(id)的情況下使用Model.where()子句而不是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 
0

添加after_create鉤到您的用戶模型。

after_create :setup_permissions 

def setup_permissions 
    #Do what you need to do here 
end 
+0

這是工作,但我得到這個錯誤:NoMethodError在設計:: RegistrationsController#創建 未定義的方法'目標」爲#<的ActiveRecord ::關聯:0x1516ac10> – user1570144

+0

您可以編輯您的問題,包括對相關的堆棧跟蹤?我不知道你的簡短描述。 – Olives