2009-06-30 8 views
2

J'ai écrit du code qui vérifie si l'utilisateur est connecté en tant qu'admin ou non pour limiter qui peut apporter des modifications aux permissions d'autres utilisateurs, mais la balise if n'est jamais vraie. Je me suis assuré que les données correctes sont là en écho, mais rien de ce que j'ai trouvé jusqu'ici ne m'a donné une solution.Grails g: si et comparaison de chaînes

<g:if test="${session.userPermissions == 'Administrator'}"> 
    <g:select id="permissions" name="permissions" from="${userInstance.constraints.permissions.inList}" value="${userInstance.permissions}" ></g:select> 
</g:if> 
<g:else> 
    ${userInstance.permissions} 
</g:else> 
+1

Quel type d'objet est stocké dans session.userPermissions? Le nom suggère en quelque sorte que c'est une liste plutôt qu'une seule chaîne. –

+0

Je le mets en chaîne, mais peut-être le traduit-il en liste. Je vais devoir vérifier ça. – Noaki

+0

C'est une liste, je peux accéder à la chaîne en utilisant session.userPermissions [0]. Mais lorsque je l'attribue, j'utilise un type de données chaîne. – Noaki

Répondre

1

Il finit par un groovy chose-

J'ai utilisé un critère pour obtenir les informations de connexion de l'utilisateur. Le critère renvoie une liste de variables utilisateur. Je définissais session.userPermissions = user.permissions

Dans groovy, vous pouvez accéder aux propriétés de chaque élément de liste et les récupérer sous la forme d'une nouvelle liste (exemple ci-dessous). Cela m'a donné les variables de la liste dans ma session. C'est une fonctionnalité vraiment cool, mais pas celle que vous aimez trouver sur un accident comme celui-ci.

groovy> def demo = [] 
groovy> demo[0] = [a:1, b:2] 
groovy> demo[1] = [a:3, b:4] 
groovy> demo[2] = [a:5, b:6] 
groovy> demo.a 

Result: [1, 3, 5] 
+2

Oui, en fait cette syntaxe est un raccourci pour demo.collect {it.a}. Cela fonctionne également pour les invocations de méthode sur les éléments de la liste: list * .myMethod() retourne une liste contenant les valeurs de retour de myMethod() invoquant tous les éléments de la liste d'origine (opérateur spread-dot). L'équivalent de collecte serait: list.collect {it.myMethod()} –

+0

cela pourrait être une cause de bogues difficiles à suivre ... hhmmm pas génial. – Chii

+0

Je n'aime vraiment pas cette fonctionnalité de Groovy (connu sous le nom "GPath"). Vous pouvez faire exactement la même chose avec 'demo * .a'. Je suis heureux de taper un caractère supplémentaire pour le rendre évident si j'accède à une propriété, ou la collecte d'une propriété –

8

essayer "java" façons de cordes: D

<g:if test="${session.userPermissions.equals('Administrator')}"> 
.... 
</g:if> 
+0

Merci pour cette suggestion! J'avais exactement le même problème dans mes fichiers .gsp où deux chaînes (ou au moins je pensais que les chaînes) x et y qui s'afficheraient de la même manière que $ {x} et% {y} échoueraient au test ===. Utiliser String.equals a résolu le problème et le mystère. –

+0

merci, travaille pour moi :) – zack

Questions connexes