2017-05-17 7 views
2

Ich verwende gem 'devise' und 'cancancan' für die Definition von Rollen für Benutzer. Problem ist, wenn ich Schienen-Server ausgeführt sein sagt: undefined method 'admin?' for nil:NilClassRuby on Rail - undefinierte Methode `admin? ' für Null: NilClass

ability.rb:

class Ability 
    include CanCan::Ability 

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

User-Modell:

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 

Was könnte das Problem sein?

+0

Sie keinen aktuellen Benutzer haben so versagt diese Sie eine Schutzklausel könnte hinzufügen oder in der gleichen Weise wie die [Fähigkeiten Docs] implementieren (https://github.com/CanCanCommunity/cancancan/wiki/ defining-facilities) – engineersmnky

Antwort

2

ich die Linie von bin zu raten, wo der Fehler Ursprung ist, ist so etwas wie:

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

Dies wahrscheinlich verursacht einen Fehler, da Ihre Benutzer nicht angemeldet ist .

Die Methode, die die Fähigkeiten definiert, sieht so aus:

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

Also, wenn Sie keinen Benutzer haben, die Linie user.admin? einen Fehler verursachen, weil usernil und nil hat keine admin? Methode.

Ich würde so etwas tun:

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

try in Ruby keinen Fehler werfen aber nil zurück, wenn die Methode nicht existiert.

(ich habe nicht getestet, und da Sie nicht den Fehler zu teilen, ich bin einige Freiheiten in der Antwort nehmen.)


ich auch darauf hinweisen, dass möchte, wenn die admin Attribut auf Ihrem User Modell ist ein boolescher Wert, Sie müssen diese Methode nicht definieren - das erledigt Rails automatisch für Sie.

def admin? 
    self.admin 
end 
0

Fähigkeit

class Ability 
include CanCan::Ability 

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

Diese Methode wird mit rolify [link] verwendet (https://github.com/RolifyCommunity/rolify/wiki/Devise---CanCanCan---rolift-Tutorial) – drope

+0

Das OP erwähnte nichts über rolify, und Das Benutzermodell, das er zeigt, hat keine 'has_role?' Methode. – seancdavis

Verwandte Themen