1

Je lance une requête pour vérifier si un ID d'entité existe pour plusieurs ID de compte. Si le résultat n'est pas nul, alors je dois soit lancer une erreur, soit afficher un message flash.Grails - Rendu Flash.Message personnalisé

Le code de la méthode est comme ci-dessous:

def save() { 

    def SAMLInfoInstance = new SAMLInfo(params) 

    def account = Account.get(params?.accountId)   
    SAMLInfoInstance.setAccount(account) 

    def samlInfoInstanceList = SAMLInfo.executeQuery("from SAMLInfo " + 
     " where account.id <> ? " + 
      " and entityId = ?", [SAMLInfoInstance.accountId, SAMLInfoInstance.entityId]) 

    if (samlInfoInstanceList?.size > 0){ 
     flash.message = message(code: 'test.not.created.message', args: [message(code: 'SAMLInfo.label', default: 'SAMLInfo'), SAMLInfoInstance.entityId]) 
     /*flash.message = "default.not.created.message" 
     flash.args = ["SAMLInfo", SAMLInfoInstance.entityId] 
     flash.default = "SAMLInfo cannot be created" 
     */ 
     render(view: "create", model: [SAMLInfoInstance: SAMLInfoInstance]) 
     return 
     } 

    if (!SAMLInfoInstance.save(flush: true)) { 
     render(view: "create", model: [SAMLInfoInstance: SAMLInfoInstance]) 
     return 
    } 

    flash.message = message(code: 'default.created.message', args: [message(code: 'SAMLInfo.label', default: 'SAMLInfo'), SAMLInfoInstance.entityId]) 
    redirect(action: "list", id: SAMLInfoInstance.account.id) 
} 

À mon avis, je rends le message flash et les erreurs de la manière suivante:

<g:if test="${flash.message}"> 
     <br/> 
     <div class="message" role="status"> 
     <g:message code="${flash.message}" args="${flash.args}" default="${flash.default}"/> 
     </div> 
     <br/> 
     </g:if> 
     <br/> 

     <g:renderErrors bean="${SAMLInfoInstance}" as="list" /> 

Dans mon fichier message.properties, J'ai la ligne suivante:

test.not.created.message=The SP url {1} is not allowed for this account. Please enter a different value. 

Quand je lance ce code, le message flash affiche que la chaîne I pas s comme message, c'est-à-dire "test.not.created.message". En outre, cette chaîne est transmise à afficher chaque fois que je navigue vers une autre page qui affiche flash.message. Je suis nouveau aux grails et groovy et apprécierais n'importe quelle aide avec ceci.

Merci!

Répondre

2

2 problèmes: alors

1 - le message n'est pas récupéré à partir de votre message.properties:

Vous devez avoir d'autres fichiers message.properties dans votre projet. Donnez-lui un chèque. Parce que s'il n'est pas trouvé, grails montre le code lui-même au lieu du message, puisqu'il n'en a pas trouvé un. Peut-être qu'il cherche votre message dans un autre fichier de propriétés, comme celui spécifique à votre Locale (ex: pt_BR ou en_US). Sinon, vous le faites correctement en utilisant le message (code: ...) construct.

2 - Votre message flash ne disparaît pas:

Au lieu de flash.message, l'utilisation request.message.

+0

Cela fonctionne :) Je suis allé de l'avant et résolu mon problème en utilisant le code suivant: 'Obj.errors.rejectValue ('entityId', 'Obj.entityId.clash.not.created.message', [message (code: 'Obj.label', valeur par défaut: 'Obj url'), Obj.entityId] as Object [], 'Cette url Obj n'est pas autorisée pour ce compte. Veuillez entrer une valeur différente.') ' qui utilise la signature de méthode qui peut être trouvée à http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/validation/Errors.html#rejectValue –

+0

tu veux dire? La demande de changement de flash? –

+0

Aussi, si la réponse a été utile, n'hésitez pas à l'accepter. ;) –

0

Je pense que l'exemple que vous voulez suivre est here.

Vous avez seulement besoin de résoudre le message une fois dans le contrôleur ou dans la vue.

Ainsi, dans le contrôleur:

flash.message = "test.not.created.message" 
flash.args = ["SAMLInfo"] 
flash.default = "<default text>" 

Et dans la vue:

<g:message code="${flash.message}" args="${flash.args}" 
      default="${flash.default}"/> 

Le flash scope is cleared at the end of the next request ce qui peut expliquer pourquoi vous voyez toujours le message sur la page suivante.

+1

Peut-être que vous souhaitez attribuer 'flash' et faire une' redirection' - alors le message ne sera affiché qu'une seule fois. –

+0

J'ai essayé de faire un 'redirection' mais j'ai une erreur disant qu'il y a déjà eu un' redirect' avant cela et par conséquent, il ne peut pas être exécuté. C'est pourquoi j'ai dû recourir à la vue. –

+0

@Tiago Farias Il n'y a pas d'autres fichiers messages.properties dans mon projet et je n'ai pas encore implémenté de messages spécifiques aux paramètres régionaux, donc ces 2 possibilités sont éliminées. –