2013-01-11 18 views
7

Sono nuovo di Grails e ho una domanda che dovrebbe essere facile per la maggior parte di voi.grails - display flash message

Ho una pagina che visualizza un elenco object. Voglio visualizzare un messaggio se c'è un DataIntegrityViolation quando uno object viene cancellato. Quello che sto facendo è:

def delete() { 

    def instanceToDelete= Myobject.get(params.id) 
    try { 
     instanceToDelete.delete(flush: true) 
     redirect(action: "list", id: params.id) 
    } 
    catch (DataIntegrityViolationException e) { 
     flash.message = "some message" 
     //I want to refresh the div containing the flash.message here 
    } 
} 

Qui è dove il messaggio flash dovrebbe essere visualizzato:

<g:if test="${flash.message}"> 
    <div class="alert alert-error" style="display: block">${flash.message}</div> 

dispiace - So che è una domanda stupida, ma davvero non posso trovare una soluzione.

+0

Qual è la domanda? Sembra che il codice sia corretto e vedrai la stringa "alcuni messaggi" in vista se viene rilevato DataIntegrityViolationException. –

+0

il problema è che non lo vedo – sara

+0

Vedo ora. Stai parlando di stili. Un po 'fraintendimento (= –

risposta

18

L'oggetto flash è un Map che memorizza coppie chiave/valore, quindi è possibile definire la propria chiave per i messaggi di errore. Per esempio:

try { 
    instanceToDelete.delete(flush: true)    
    flash.message = "successfully deleted object" 
} 
catch (DataIntegrityViolationException e) { 
    flash.error = "could not delete object"    
} 
redirect(action: "list", id: params.id) 

Quindi è possibile controllare l'oggetto flash contenente la chiave error, e utilizzare uno stile diverso per quel tipo di messaggio:

<g:if test="${flash.error}"> 
    <div class="alert alert-error" style="display: block">${flash.error}</div> 
</g:if> 
<g:if test="${flash.message}"> 
    <div class="message" style="display: block">${flash.message}</div> 
</g:if> 
+0

Come posso visualizzare il messaggio senza reindirizzamento? Fondamentalmente non voglio reindirizzare alla lista perché lì ricarico la lista degli oggetti e se non cancro niente non ho bisogno di ricaricare – sara

+1

Non puoi modificare i dati del cliente senza un ricaricamento del browser (reindirizzamento/inoltro del server) a meno che tu non stia inviando le tue richieste tramite Ajax. – Gregg

1

risposta Strict: Basta restituire il messaggio (o rendere con una mappa del modello)

per il controller:

def delete() { 

    def instanceToDelete= Myobject.get(params.id) 
    try { 
     instanceToDelete.delete(flush: true) 
     redirect(action: "list", id: params.id) 
    } 
    catch (DataIntegrityViolationException e) { 
     render view:'delete', model:[message: "some message"] 
     //I want to refresh the div containing the flash.message here 
    } 
} 

per il GSP:

<g:if test="${message}"> 
    <div class="alert alert-error" style="display: block">${message}</div> 

Ma Gregg ha ragione, si dovrebbe mai modificare i dati dei clienti senza un redirect. Se lo fai, l'utente può aggiornare (o tornare a) lo stesso url e riprovare la stessa azione accidentalmente. Dovresti davvero fare come nella risposta di hitt5.

3

Questo può aiutare a:

def delete() { 
    def instanceToDelete= Myobject.get(params.id) 
    try { 
     instanceToDelete.delete(flush: true) 
     flash.success = "Object deleted correctly" 
    } catch (DataIntegrityViolationException e) { 
     flash.error = "Something goes wrong" 
    } 
    redirect(action: "list", id: params.id) 
} 

redirect al GSP dopo tutto il codice, al grado di memorizzare, se si verifica un errore o tutto va bene.

puoi mettere i messaggi in diverse variabili per discriminare tra errore e successo.

<g:if test="${flash.success}"> 
    <div class="alert alert-success" style="display: block">${flash.success}</div> 
</g:if> 
<g:if test="${flash.error}"> 
    <div class="alert alert-error" style="display: block">${flash.error}</div> 
</g:if>