libro
www.tuyano.com
初心者のためのGroovy/Grails入門

バリデーションとフォームヘルパー (2/5)

作成:2013-11-16 10:19
更新:2013-11-16 10:19

■コントローラー側のバリデーション処理

では、こうして用意されたバリデーションのチェックはどのように行えばいいのでしょうか。実は、これも簡単です。単に「save」で保存すればいいのです。

Grailsでは、データの保存はドメインクラスのインスタンスを作成し、saveを呼び出します。このsaveが実行されると、Grailsのシステムは値が正しく入力されているかをチェックし、問題なければ保存します。もし問題があった場合には保存をせず、falseを返すのです。つまり、saveの結果がfalseであれば、入力に問題があったとみなすことができるわけです。

では、先ほどのSampleDataの利用例として、データを保存するアクションを作成してみましょう。先に保存のcreateアクションを作りました(http://libro.tuyano.com/index3?id=1466003)。これを、バリデーション利用の形に書きなおしてみましょう。

下にコントローラーのcreateメソッドの作成例を挙げておきました。コントローラーを考えるとき、注意しなければならないのは「ビューとの兼ね合い」です。どのような形でビューを用意するかを念頭に置いて設計しなければいけません。

ここでは、今までやってきたような素のHTMLタグでフォームを用意するのではなく、GSPのカスタムタグを使ってフォームを用意する形でビューテンプレートを用意することを前提にアクションを作っています。ビューテンプレートの内容についてはこの次に説明するとして、ざっとコントローラー側のポイントを整理しましょう。

・送信されたフォームによるドメインインスタンスの作成
data = new SampleData(params);
ビューテンプレート側からは、SampleDataの内容そのままの形でフォームが送信されてくる、という前提で作成しています。このため、インスタンスの作成は、送られたパラメータをまとめているparamsを引数にしてnew SampleDataするだけで行えます。

・保存とバリデーションチェック
if (data.save()){
    redirect(action:"index");
}
作成したインスタンスのsaveを呼び出し、保存をします。その結果がtrueなら、問題なく保存できたということでそのままindexにリダイレクトします。バリデーションのチェックは、このsave呼び出しで既に完了しています。

・createをレンダリングする
render(
    view:'create',
    model:['sampledata':data,
        'title':"Create Data",
        'msg':"入力してください。"]);
}
saveの返値がfalseならば、保存に失敗しているため、再度createのビューテンプレートを表示します。これはrenderメソッドで行います。このとき、以下のような形で引数を用意していることがわかるでしょう。
render( view:テンプレート名 , model:[渡すデータをまとめたマップ] );
view:でテンプレート名を指定するのは既にやりました。問題は次のmodel:です。ここに、ビューテンプレート側で利用する各種の値をマップとしてまとめておくのです。ここではtitlemsgといったテキストの他に、作成されたSampleDataインスタンスもsampledataという名前で保管しています。

renderを使ってビューテプレートをレンダリングする際に必要な値を受け渡す場合には、このようにmodel:に値を設定するのが基本になります。

・GET時の処理
def arr = [
    'title':"Create Data",
    'msg':"入力してください。",
    sampledata:data
];
arr;
最後に、POSTでない、通常のGETアクセスされた時の処理を用意しておきます。例によって変数arrに渡すデータをマップにまとめ、それを出力しています。今回はsampledataという名前でSampleDataインスタンスも渡すようにしておくのを忘れないでください。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※SampleDataControllerクラスのcreateメソッド

def create = {
    def data = null;
    if (request.method=='POST'){
        data = new SampleData(params);
        if (data.save()){
            redirect(action:"index");
        } else {
            render(
                view:'create',
                model:['sampledata':data,
                    'title':"Create Data",
                    'msg':"入力してください。"]);
        }
    }
    def arr = [
        'title':"Create Data",
        'msg':"入力してください。",
        sampledata:data
    ];
    arr;
}
※関連コンテンツ

「初心者のためのGroovy/Grails入門」に戻る