Question

I'm still pretty new to Grails and I'm developing an online survey. I decided to use web flow and I have been running into many issues. I'm trying to pass the survey id from the gsp page to the flow controller. This works perfectly fine on any other controller action but whenever I do it to the action for the start state of the flow I always get the same error. I've followed a tutorial in a text book that does this the EXACT same way and I'm running out of ideas.

here is the link from the gsp page:

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

and here is the flow with the start state

def beginTestFlow = {

    showSurvey{

        def survey = Survey.get(params.id)

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

    }

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

it always throws the exception:

argument type mismatch on the line with

def survey = Survey.get(params.id)

I've also tried:

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

or even:

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

always the same error. Also, I made sure class Survey implements Serializable. I've copied and pasted the same code into a different action with the same controller and it works flawlessly. Any ideas to what is different with the web flow?

Was it helpful?

Solution

You can't put code like that directly inside a state definition, you need to use an action state or an onEntry block

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

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

The onEntry block will fire every time the showSurvey state is entered. If instead you want some logic to be run just once at the start of the whole flow (for example if some later transition might re-enter the initial state), you can use a flow-level onStart block instead:

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

OTHER TIPS

Ivo Houbrechts wrote an excelent tutorial about grails 2.0 webflow. You can read it here:

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top