Frage

Ich bin noch ziemlich neu bei Grails und entwickle eine Online-Umfrage.Ich habe mich für Web Flow entschieden und bin auf viele Probleme gestoßen.Ich versuche, die Umfrage-ID von der GSP-Seite an den Flow Controller zu übergeben.Dies funktioniert bei jeder anderen Controller-Aktion einwandfrei, aber wenn ich es mit der Aktion für den Startstatus des Flows mache, erhalte ich immer die gleiche Fehlermeldung.Ich habe einem Tutorial in einem Lehrbuch gefolgt, das dies GENAU auf die gleiche Weise macht, und mir gehen die Ideen aus.

Hier ist der Link von der GSP-Seite:

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

und hier ist der Ablauf mit dem Startzustand

def beginTestFlow = {

    showSurvey{

        def survey = Survey.get(params.id)

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

    }

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

es löst immer die Ausnahme aus:

Nichtübereinstimmung des Argumenttyps in der Zeile mit

def survey = Survey.get(params.id)

Ich habe auch versucht:

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

oder auch:

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

immer der gleiche Fehler.Außerdem habe ich dafür gesorgt, dass die Klasse Survey Serializable implementiert.Ich habe denselben Code kopiert und in eine andere Aktion mit demselben Controller eingefügt, und er funktioniert einwandfrei.Irgendwelche Ideen, was beim Web-Flow anders ist?

War es hilfreich?

Lösung

Sie können solchen Code nicht direkt in eine Statusdefinition einfügen, sondern müssen einen Aktionsstatus oder einen verwenden onEntry Block

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

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

Der onEntry Der Block wird jedes Mal ausgelöst showSurvey Zustand eingegeben wird.Wenn Sie stattdessen möchten, dass eine Logik nur einmal zu Beginn des gesamten Flusses ausgeführt wird (z. B. wenn ein späterer Übergang möglicherweise wieder in den Ausgangszustand übergeht), können Sie eine Flussebene verwenden onStart stattdessen blockieren:

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

Andere Tipps

ivo houbrechts schrieb ein exzellentes Tutorial über Gralt 2.0 Webflow.Sie können es hier lesen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top