0

私はまだ Grails にかなり慣れていないので、オンライン調査を開発しています。Web フローを使用することにしましたが、多くの問題が発生しています。gsp ページからフロー コントローラーに調査 ID を渡そうとしています。これは他のコントローラ アクションでは問題なく動作しますが、フローの開始状態のアクションに対して実行するたびに、常に同じエラーが発生します。これをまったく同じ方法で行う教科書のチュートリアルに従いましたが、アイデアが不足しています。

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代わりに、一部のロジックをフロー全体の開始時に 1 回だけ実行する場合 (たとえば、後の遷移で初期状態に再び入る可能性がある場合)、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 に答える