1

次の例のような Grails WebFlow があります。

def myFlow = {
    init {
        action {
            def domain = MyDomain.get(params.id)
            flow.domain = domain ? domain : new MyDomain()
        }
        on('success').to 'first'
    }

    first {
        on('continue') {
            flow.domain.properties = params
            if(!flow.domain.validate()) {
                return error()
            }
        }.to 'second'
    }

    ...
}

この例では、 の遷移on('continue')で検証エラーが発生した場合first:

  • ビューでa を使用できるように、無効なドメイン オブジェクトを使用してモデルを設定するための推奨される方法は何ですか<g:hasErrors>...(通常のコントローラー アクションで行うように)。
  • を呼び出すとerror()、フローは に戻されますか?initまたは に戻されfirstますか?
  • error()私が達成しようとしていることに使用できる任意の引数 (つまり、モデル) を取ります (メソッドに関するドキュメントはあまり見つかりません) error()
  • また、これらの検証エラーの処理をより容易にするために、フローの状態を改善する方法についても提案します。

概要: Grails Web フロー内で検証エラーをレンダリングするための推奨される方法は何ですか?

4

2 に答える 2

3

-1

モデルに無効​​なドメイン オブジェクトを設定して、ビューで ... を使用できるようにするための推奨される方法は何ですか (通常のコントローラー アクションの場合と同様)。

エラーのあるドメイン オブジェクトを返すだけです。アクション状態でそれを行うことができます

action {
  user.validate()
  return [user:user]
}

フラッシュ スコープでエラーを設定することもできます。トランジションごとに、Grails はフラッシュ スコープのコンテンツを ModelView にコピーし、gsp ページで使用できるようにします。

action {
   flash.error = "your message"
}

-2

error() を呼び出すと、フローは init または first に戻されますか? エラーを呼び出すと、定義したトランジションが呼び出されます

次のようなハンドラを定義する必要があります

on("error").to("handlerError")

error() は、達成しようとしていることに使用できる引数 (つまり、モデル) を取りますか (error() メソッドに関するドキュメントはあまり見つかりません)。

そうは思いませんが、次のようにして、ある状態から別の状態に遷移するときに変数を設定できます

on("error") {
  // do Something
}.to("handlerError")

3-

また、これらの検証エラーの処理をより容易にするために、フローの状態を改善する方法についても提案します。

グローバルエラーとフォームエラーにはフラッシュを使用しますが、それを処理する方法が 1 つ必要でした。現在、Grails では、フラッシュ スコープは、通常のアクションで管理される場合とは異なる方法でフローで管理されます。そこで、フラッシュ スコープがフローで処理される方法を変更し、通常のアクションで管理される方法と一貫性を持たせるための小さなプラグインを作成することにしました。私は gsp ページで、アクション タイプ (通常またはフロー) に関係なく、次の方法でタグを使用できます。

    <message:global />
or 
    <message:inline />

フォーム フィールドのエラーに関しては、ドメイン オブジェクトのエラーを処理するのが好きではありませんでした。もっと統一感のあるものが欲しかった。だから私はそれらを http プロトコルの一部にすることに決めました。この解決策は、毎回 g:errors を処理するよりもはるかにクリーンであることがわかりました。

けん

于 2010-09-21T22:31:45.273 に答える
0

render()それを行う1つの方法は、モデルを提供して、遷移状態で具体的に呼び出すことです。1 つのフィールドのみが検証される例を次に示します。

first {
    render(view: 'info', model: [flow.domain])
    on('continue') {
        if(!flow.domain.validate(['myField'])) {
            return error()
        }
    }.to 'second'
}

<g:hasErrors>次に、次のように使用できます。

<g:hasErrors bean="${domain}" field="myField">
    <g:renderErrors bean="${domain}" as="list" field="myField"/>
</g:hasErrors>
于 2010-09-21T11:48:35.057 に答える