0

我对 Grails 还是很陌生,我正在开发一个在线调查。我决定使用网络流,但我遇到了很多问题。我正在尝试将调查 ID 从 gsp 页面传递到流控制器。这在任何其他控制器操作上都可以正常工作,但是每当我对流的开始状态的操作执行此操作时,我总是会遇到相同的错误。我已经按照教科书中的教程进行了完全相同的操作,但我的想法已经不多了。

这是gsp页面的链接:

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

这是开始状态的流程

def beginTestFlow = {

    showSurvey{

        def survey = Survey.get(params.id)

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

    }

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

它总是抛出异常:

参数类型不匹配与

def survey = Survey.get(params.id)

我也试过:

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

甚至:

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

总是同样的错误。另外,我确保类 Survey 实现了 Serializable。我已经将相同的代码复制并粘贴到具有相同控制器的不同操作中,并且它可以完美运行。对 Web 流程有什么不同的任何想法?

4

2 回答 2

0

您不能将这样的代码直接放在状态定义中,您需要使用动作状态或onEntry

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

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

onEntry每次进入状态时都会触发该块showSurvey。相反,如果您希望某些逻辑在整个流程开始时只运行一次(例如,如果稍后的转换可能重新进入初始状态),您可以使用流程级onStart块代替:

def beginTestFlow = {
    onStart {
        flow.survey = Survey.get(params.id)
    }
    showSurvey{
        on("cancel").to "cancelSurvey"
        // ...
于 2012-07-26T10:30:51.783 回答
0

Ivo Houbrechts 写了一篇关于 grails 2.0 webflow 的优秀教程。你可以在这里阅读它:

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

于 2012-08-06T19:09:07.933 回答