2010-07-13 4 views
1

Je travaille sur http://railstutorial.org (travaille actuellement sur la section 10.4.2 - détruire des utilisateurs).Attributs du modèle booléen comme méthodes automatiques

Mon modèle utilisateur a un booléen admin attribut, et dans le contrôleur des utilisateurs il y a un code simple faisant usage de cet attribut:

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 

Le test RSpec:

describe "as a non-signed-in user" do 
    it "should deny access" do 
    delete :destroy, :id => @user 
    response.should redirect_to(signin_path) 
    end 
end 

Et l'erreur ce test produit:

NoMethodError dans 'UsersController DELETE' détruire 'en tant que non-signe L'utilisateur doit refuser l'accès ' méthode non définie `admin?' pour néant: NilClass

Qu'est-ce que nil: NilClass? Pourquoi je reçois ça?

modifier. j, cela pourrait aider:

def sign_in(user) 
    user.remember_me! 
    cookies[:remember_token] = { :value => user.remember_token, 
           :expires => 20.years.from_now.utc } 
    self.current_user = user 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    @current_user ||= user_from_remember_token 
    end 
+0

On dirait que 'current_user' est nul –

+0

Daniel, même erreur après avoir changé à @current_user – nnyby

+0

Vérifiez la méthode' current_user' Il est de retour 'nil' pourrait... vous postez cette méthode? –

Répondre

2

Bonnes nouvelles! Votre test rspec a trouvé un bug!

Votre méthode du contrôleur

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 

est appelé directement ou indirectement par l'action de suppression de votre contrôleur.

Et admin_user est appelé lorsque current_user est nul. Ainsi, la méthode de admin_user échoue avec l'erreur

undefined method `admin?' for nil:NilClass 

fix: dépend de la façon dont admin_user est appelé et utilisé. Est-ce dans un filtre?

Peut-être changé à l'une des

def admin_user 
    redirect_to(root_path) unless current_user && current_user.admin? 
end 

# or 
def admin_user 
    redirect_to(root_path) if current_user && !current_user.admin? 
end 

en fonction de la situation ....

0

Il ressemble à votre objet current_user est nul et il devrait être nul.

Comme vous n'êtes pas connecté, votre _user actuel est nul et alors vous essayez d'obtenir nil.admin? c'est pourquoi ça donne aucune erreur de méthode.

probabily vous devez réécrire votre méthode quelque chose comme

def admin_user 
    redirect_to(root_path) unless current_user || current_user.admin? 
end 
0

Avez-vous la section complète 9.3.4 Current User du tutoriel? Cela crée une variable current_user dans le SessionsController via l'inclusion du module SessionsHelper.

0

J'ai eu ce problème exact, et j'ai trouvé que le problème sous-jacent était que je n'avais pas réussi à ajouter :destroy au before_filter :authenticate dans app/controllers/users_controller.rb, comme ci-dessous (à partir listing 10.41:

before_filter :authenticate, :only => [:index, :edit, :update, :destroy]

Questions connexes