Domanda

Sono ancora abbastanza nuovo per Grails e sto sviluppando un sondaggio online. Ho deciso di usare il flusso web e ho corso in molti problemi. Sto cercando di passare l'ID del sondaggio dalla pagina GSP al controller di flusso. Questo funziona perfettamente a qualsiasi altra azione del controller ma ogni volta che lo faccio all'azione per lo stato di partenza del flusso, ottengo sempre lo stesso errore. Ho seguito un tutorial in un libro di testo che fa questo esattamente lo stesso modo e sto finendo le idee.

Ecco il link dalla pagina GSP:

<g:link controller="surveyPage" action="beginTest" id="${survey.id}">
${survey.surveyName}
</g:link>
.

Ed ecco il flusso con lo stato di partenza

def beginTestFlow = {

    showSurvey{

        def survey = Survey.get(params.id)

        on("cancel").to "cancelSurvey"
        on("continueSurvey").to "nextQuestion"

    }

    cancelSurvey { redirect(controller:"surveyPage") }
}
.

Getta sempre l'eccezione:

Mancata corrispondenza del tipo argomento sulla linea con

def survey = Survey.get(params.id)
.

Ho anche provato:

flow.survey = Survey.get(params.id)
.

o anche:

flow.survey = Survey.get(session.survey.id)
.

sempre lo stesso errore. Inoltre, ho assicurato Sure Survey Survey implement serializzabile. Ho copiato e incollato lo stesso codice in un'azione diversa con lo stesso controller e funziona perfettamente. Qualche idea su ciò che è diverso con il flusso web?

È stato utile?

Soluzione

Non è possibile inserire il codice come quello direttamente all'interno di una definizione di stato, è necessario utilizzare uno stato d'azione o un blocco onEntry

def beginTestFlow = {
    showSurvey{
        onEntry {
            flow.survey = Survey.get(params.id)
        }
        on("cancel").to "cancelSurvey"
        on("continueSurvey").to "nextQuestion"
    }

    cancelSurvey { redirect(controller:"surveyPage") }
}
.

Il blocco onEntry si attiverà ogni volta che viene inserito lo stato showSurvey.Se invece si desidera che una logica venga eseguita solo una volta all'inizio dell'intero flusso (ad esempio se una transizione successiva potrebbe reinserire lo stato iniziale), è possibile utilizzare invece un blocco onStart di livello di flusso:

def beginTestFlow = {
    onStart {
        flow.survey = Survey.get(params.id)
    }
    showSurvey{
        on("cancel").to "cancelSurvey"
        // ...
.

Altri suggerimenti

Ivo Houbrechts ha scritto un tutorial eccellente su Grails 2.0 webflow.Puoi leggerlo qui:

http://livesnippets.cloudfoundry.com/docs/guide/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top