2010-11-06 41 views
0

Je voudrais avoir la connexion et la déconnexion sur la première page de mon application de grails et avoir n'importe quels messages d'erreur montrés là. J'ai une fonction d'authentification codée dans mon domaine utilisateur avec une fonction de déconnexion. Après que quelqu'un se connecte à la fonction d'authentification, je parviens à les faire revenir à l'écran principal en faisant une redirection:Je voudrais pouvoir laisser des personnes se connecter/se déconnecter sur la première page de mon application de grails

redirect(uri:"") 

Si je fais la même chose avec la fermeture de session, je reçois une erreur lorsque la page est rendue , disant qu'il ne peut pas trouver l'objet utilisateur. Voici la sortie.

Erreur 500: Action exécution [logout] du contrôleur [com.thornglatch.pingo.UserController] fait exception: Aucun bien: nom pour la classe: com.thornglatch.pingo.User Solutions possibles: jeux Servlet: Grails URI: /Pingo/grails/user/logout.dispatch Message d'exception: Pas de cette propriété: nom de la classe: com.thornglatch.pingo.User Solutions possibles: jeux Causé par: Aucune propriété: nom de la classe: com.thornglatch .pingo.User solutions possibles: jeux classe: UserController à la ligne: [25]

Voici les choses qu'il essaie de rendre, je crois:

<div id="menu"> 
    <nobr> 
    <g:if test="${session.user}"> 
     <b>${session.user?.firstName}&nbsp;${session.user?.lastName}</b> | 
     <g:link controller="user" action="logout">Logout</g:link> 
    </g:if> 
    <g:else> 
     <g:link controller="user" action="login">Login</g:link> 
    </g:else> 
    </nobr> 
</div> 

Nous vous remercions de votre temps et de votre attention.


Voici le code Authentifier:

def authenticate = { 
    println "Authenticate Entered" 
    def user = User.findByLoginAndPassword(params.login, params.password) 
    println "User = [" + user + "]" 
    if (user) { 
     session.user = user 
     def name = user.firstName ?: user.lastName 
     flash.message = "Hello ${user.login}" 
     redirect(uri:"") 
    } else { 
     println "Should be saying sorry" 
     flash.message = "Sorry, ${params.login}. Please try again.}" 
     redirect(uri:"") 
    } 
} // authenticate 

Cette version fonctionne. Dans celui qui n'a pas, la ligne de flash.message était:

flash.message = "Hello ${name}" 

Je peux vivre avec cela, mais je voudrais savoir pourquoi utiliser le nom ne fonctionnait pas.

Répondre

0

Cela ne ressemble pas à une erreur fonctionnelle, comme le problème que vous avez décrit. En fait, l'extrait semble correct, il est invoqué correctement.

Le problème semble être que vous essayez d'accéder à une propriété qui n'existe pas (name) à l'exécution dans la classe com.thornglatch.pingo.User.

Jetez un oeil à com.thornglatch.pingo.UserController ligne 25 et vérifiez que le name que vous utilisez a un setter et un getter ou qu'il s'agit d'un champ public dans com.thornglatch.pingo.User. Ou vérifiez que, s'il s'agit d'une variable, la déclaration existe. Rappelez-vous que Groovy est un langage dynamique, vous devez donc faire attention car les vérifications d'accès aux champs membres se produiront au moment de l'exécution.

+0

J'ai ajouté des informations supplémentaires après avoir réexaminé le code avec vos commentaires en tête. J'ai une version qui fonctionne maintenant, mais j'ai toujours une question, comme vous pouvez le voir. – Rben

+0

Eh bien, "nom" devrait fonctionner. Avez-vous essayé avec "def name = 'Hardcoded Name'"? – mschonaker