2010-09-19 7 views
2

Je donne les résultats suivants instruction if:Rails 3 - Instruction IF qui ne rompt pas le NIL

if !projectid_viewing.nil? && !user.role(projectid_viewing).nil? && user.role(projectid_viewing) == 'admin' 

Ce que je suis en train de faire avec ce qui précède, est pas le cas d'interruption ou de l'utilisateur projectid_viewing .role sont nuls. projectid_viewing semble fonctionner à merveille, mais user.role continue à briser, ce qui donne l'erreur suivante:

undefined method `role' for nil:NilClass 

Pouvez-vous me aider avec l'instruction if et est-il une façon plus élégante d'écrire la déclaration?

Répondre

5

Vous devez également vous assurer que cet utilisateur n'est pas nul.

Notez que dans Ruby, une valeur de zéro dans une instruction conditionnelle sera interprétée comme fausse. Ainsi, si vous utilisez une variable avec une valeur nulle dans une instruction conditionnelle, elle sera également évaluée comme fausse. Sachant cela, vous pouvez simplifier les instructions comme !projectid_viewing.nil? juste le nom de la variable, et cela fonctionnera tout de même.

if projectid_viewing && user && user.role(projectid_viewing) == 'admin' 

Ce qui précède est tout simplement Ruby, mais vous avez dit que vous utilisez Rails 3. Rails a une méthode peu soignée: Object#try. Il vous permettra de simplifier cette déclaration plus à ce qui suit:

if projectid_viewing && user.try(:role, projectid_viewing) == 'admin' 

L'objet méthode # try vous protéger si la valeur de l'utilisateur est nul, et que toute la seconde partie de l'expression retournera nulle (c.-à- faux).

+2

La réponse est correcte, mais 'nil == false' ne retournera pas' true'! –

+1

Merci Marcel, j'ai mis à jour la réponse. – Chris

+0

Très bien! est-il possible d'utiliser la méthode TRY sur quelque chose comme "permissions.find_by_project_id (projectid) .role.name"? – AnApprentice