2017-08-30 3 views
0

Ce code me donne l'erreur suivante:Pourquoi cette fonction donne-t-elle une erreur de méthode non définie mais s'exécute avec byebug?

undefined method `user_id' for nil:NilClass

def show_username(shipment) 
    userid = shipment.logs.last.user_id 
    User.find(userid).name 
    end 

Cependant, si j'insérer un byebug je peux exécuter le code et accéder à toutes les variables et les méthodes sans aucune erreur.

En utilisant byebug je reçois les réponses suivantes:

(byebug) shipment.logs.last 
Log Load (0.3ms) SELECT "logs".* FROM "logs" WHERE "logs"."shipment_id" = $1 ORDER BY "logs"."id" DESC LIMIT $2 [["shipment_id", 95], ["LIMIT", 1]] 
    #<Log id: 87, activity: "Shipment updated", created_at: "2017-08-28 15:19:07", updated_at: "2017-08-28 15:19:07", shipment_id: 95, user_id: 3> 

(byebug) shipment.logs.last.user_id 
    Log Load (2.6ms) SELECT "logs".* FROM "logs" WHERE "logs"."shipment_id" = $1 ORDER BY "logs"."id" DESC LIMIT $2 [["shipment_id", 95], ["LIMIT", 1]] 
3 
+0

quelle est la valeur de l'expédition .logs.last? – sakurashinken

+0

En supposant que nous sommes dans Rails ici en raison de l'étiquette. Avez-vous une configuration d'association entre l'expédition et les utilisateurs? Aussi, avez-vous sauté dans 'rails console' et validé' shipment.logs.last.user_id' renvoie comme prévu? Si vous avez créé des associations correctement, je suppose que vous pourriez faire quelque chose comme 'shipment.logs.last.user.name' à la place. – ddubs

+0

J'ai mis à jour la question. Les associations fonctionnent quand j'utilise 'byebug'. Je ne comprends pas pourquoi il y a une erreur quand le code fonctionne naturellement. – BBORNCR

Répondre

1

Le shipment.logs.last doit être nil! Peut-être que vous appelez la méthode de fois et votre byebug s'arrête dans un contexte shipment.logs.last n'est pas nil ...

Essayez de debug donner une condition d'appeler byebug:

def show_username(shipment) 
    byebug unless shipment.logs.last 
    userid = shipment.logs.last.user_id 
    User.find(userid).name 
end 
+0

C'était le problème! Quand j'ai traversé le byebug image par image, il y avait finalement des envois qui n'avaient pas de journaux. Je vais valider que les journaux existent. – BBORNCR