2010-07-14 6 views
0

J'ai des déclarations telles que @user = User.find(current_user.id) tout au long de ma demande.Echapper élégamment aux erreurs

Parfois, un utilisateur peut entrer avec une variable nil (par exemple un nouvel utilisateur pour lequel current_user est nul).

Je suis sûr que la façon stupide de le faire serait de disperser si des déclarations partout comme ...

if current_user.exists? 
    @user = User.find(current_user.id) 
else 
    redirect_to root_url 
    ---*or*--- 
    @user = "new" # for use with if/case statements later on 
end 

Quelle est la façon élégante pour faire face à cette confusion?

Répondre

0

@user = User.find(current_user.id) est un peu inutile. La plupart du temps parce que current_user est un objet utilisateur déjà, à tout le moins vous devriez faire @user = current_user, mais je recommande que si elle est déjà fait par le cadre d'authentification, je voudrais ajouter ceci pour vous contrôleur d'application:

helper_method :current_user 

Cela rendra l'objet current_user disponible pour vos vues et rendra l'objet @user inutile.

Pour la manipulation réoriente, j'ai l'habitude dans mon contrôleur d'application:

before_filter :require_login 

def require_login 
    current_user || redirect_to(root_url) 
end 

Et puis dans mes contrôleurs qui ne veulent pas rediriger:

skip_before_filter :require_login 

En ce qui concerne la mise à l'utilisateur de nouveau , Je ne le ferais pas. En général, j'aime que mes objets User soient des objets utilisateur. Je voudrais juste tester un nouvel utilisateur par if current_user où un utilisateur actuel nul est le même que le réglage à «nouveau».

J'espère que cette aide

+0

Génial!Merci beaucoup Geoff. – sscirrus

0

En supposant que la langue que vous utilisez est orientée objet, je créer un objet qui contient le contexte utilisateur actuel. Par défaut, vous pouvez utiliser une instance CurrentUserContext pour les utilisateurs connus dont l'accès est très limité. Lorsque les utilisateurs se connectent, vous pouvez charger toutes les informations utilisateur et les informations de sécurité dans une nouvelle instance de CurrentUserContext.

C'est juste une idée approximative, mais peut-être que ça aide.

edit: De cette façon vous n'aurez pas besoin de créer toutes sortes de règles d'exception de sécurité ... Vous assumez simplement les paramètres de sécurité de l'instance de contexte en cours et ajustez le comportement de l'application en conséquence.

+0

Vous pouvez trouver la langue des balises attachées à la question, dans ce cas, Ruby on Rails. Merci beaucoup pour votre réponse. – sscirrus

0

Pour obtenir nils quand il n'y a pas d'utilisateur actuel:

@user = current_user && User.find(current_user.id)

Pour obtenir "nouveau" quand il n'y a pas d'utilisateur courant:

@user = current_user ? User.find(current_user.id) : 'new'

Ni résout vraiment le problème, mais maintenant au moins c'est sur une ligne. Pour une solution plus générale, vous devriez peut-être supprimer la variable current_user.

Questions connexes