2017-05-17 88 views
2

我使用gem 'devise''cancancan'來定義用戶的角色。問題是,當我運行軌道服務器的說:undefined method 'admin?' for nil:NilClassRuby on Rail - 未定義的方法`admin?'爲零:NilClass

ability.rb:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end 

用戶模式:

class User < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :projects 

    def admin? 
    self.admin 
    end 
end 

可能是什麼問題呢?

+0

你沒有一個當前用戶如此失敗,你可以以同樣的方式附加保護條款或實施爲[能力文件(https://github.com/CanCanCommunity/cancancan/wiki/定義能力) – engineersmnky

回答

2

我猜從錯誤所在始發線是一樣的東西:

if can? :manage, @object 
    # ... 

這可能導致一個錯誤,因爲用戶沒有登錄

定義能力的方法如下所示:

def initialize(user) 
    if user.admin? 
    can :manage, :all 
    else 
    can :read, :all 
    end 
end 

所以,如果你沒有用戶,該行user.admin?將導致一個錯誤,因爲usernilnil沒有admin?方法。

我會做這樣的事情:

def initialize(user) 
    if user.try(:admin?) 
    can :manage, :all 
    else 
    can :read, :all 
    end 
end 

try在Ruby中不會引發錯誤,但將返回nil如果方法不存在。

(我沒有測試過這一點,因爲你沒有共享的錯誤,我採取了一些自由的響應。)


我還想指出的是,如果adminUser模型的屬性是一個布爾值,您不需要定義此方法 - Rails會自動爲您執行此操作。

def admin? 
    self.admin 
end 
0

能力

class Ability 
include CanCan::Ability 

    def initialize(user) 
    if user.has_role? :admin 
    can :manage, :all 
    else 
    can :read, :all 
    end 
    end 
end 
+0

此方法與rolify [鏈接](https://github.com/RolifyCommunity/rolify/wiki/Devise--- CanCanCan---rolify-Tutorial)一起使用 – drope

+0

OP沒有提及rolify,並且他顯示的用戶模型沒有'has_role?'方法。 – seancdavis

相關問題