7

書籍Getting Started with Grails - 2eの 42 ページ (紙のページではなく電子ページ) に、次の例がリストされています。

class Race {

    static constraints = {

        name(blank:false, maxSize:50)


        // NOTE: This doesn’t do
        // what you think it does
        startDate(min: new Date())

        // And this is what we're supposed
        // to be using:
        // startDate(validator: {return (it > new Date())})
    }

    String name
    Date startDate
    // ...
}

読者は、startDate上記のコメントアウトされたバージョンを使用することをお勧めします。引用された理由は次のとおりです。static constraintsプロパティは(サーバーの起動時に)一度だけ評価されますが、私たちの意図は、インスタンス化とその後の検証のたびに評価されるようにすることですRace

私の質問は次のとおりです。なぜ、制約の非閉鎖スタイルがname各検証試行で機能するのに、制約では機能しないのstartDateですか? 逆に、クロージャー フレーバーが に必要な場合startDate、なぜ にも必要でないのnameでしょうか?

上記の Groovy 構文を正しく理解していれば、static constraintブロックにリストされている各制約は、構文的には、さまざまな検証属性を として受け取る関数の呼び出しであるように見えますMap。静的ブロックはサーバーの起動時に (1 回) 評価されるため、両方の関数呼び出しもサーバーの起動時に (1 回) 発生し、非閉鎖形式で同一の一貫した動作につながるはずです。そうじゃない?

4

2 に答える 2

10

あなたが行くなら:

    startDate(min: new Date())

その後new Date()、サーバーの起動時に評価され、変更されることはありません。したがって、来週 (サーバーが稼働し続けていると仮定) は、先週に対して日付を検証します。

2 番目の形式:

    startDate(validator: {return (it > new Date())})

制約がチェックされるたびに評価されるため、サーバーの稼働時間に関係なく、常に今日に対して検証されます。

一方、name関係する場合は、静的コンテンツに対して検証されます。つまり、値は検証が行われるたびに評価されるわけではないため、クロージャmaxSizeを使用する代わりにキーと値のペアとして持つことが理にかなっている 50です。のために。validator50namestartDate

編集:

callname( maxSize:50 )呼び出しが評価されると、実際には fieldのMaxSizeConstraintオブジェクトnameが作成されます。このマップはproperty->constraints、オブジェクトが検証されるときにプロパティをチェックするために grails によって使用されます。そのクラスでわかるように、maxSizeは私有財産です。実際、maxSize時間の経過とともに変更したい場合は、次のようにカスタムバリデーターを使用する必要がありますDate

于 2013-07-01T14:20:55.830 に答える