バリデーションとフォームヘルパー (2/5)
作成:2013-11-16 10:19
更新: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のカスタムタグを使ってフォームを用意する形でビューテンプレートを用意することを前提にアクションを作っています。ビューテンプレートの内容についてはこの次に説明するとして、ざっとコントローラー側のポイントを整理しましょう。
・送信されたフォームによるドメインインスタンスの作成
・保存とバリデーションチェック
・createをレンダリングする
renderを使ってビューテプレートをレンダリングする際に必要な値を受け渡す場合には、このようにmodel:に値を設定するのが基本になります。
・GET時の処理
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()){作成したインスタンスのsaveを呼び出し、保存をします。その結果がtrueなら、問題なく保存できたということでそのままindexにリダイレクトします。バリデーションのチェックは、このsave呼び出しで既に完了しています。
redirect(action:"index");
}
・createをレンダリングする
render(saveの返値がfalseならば、保存に失敗しているため、再度createのビューテンプレートを表示します。これはrenderメソッドで行います。このとき、以下のような形で引数を用意していることがわかるでしょう。
view:'create',
model:['sampledata':data,
'title':"Create Data",
'msg':"入力してください。"]);
}
render( view:テンプレート名 , model:[渡すデータをまとめたマップ] );view:でテンプレート名を指定するのは既にやりました。問題は次のmodel:です。ここに、ビューテンプレート側で利用する各種の値をマップとしてまとめておくのです。ここではtitle、msgといったテキストの他に、作成されたSampleDataインスタンスもsampledataという名前で保管しています。
renderを使ってビューテプレートをレンダリングする際に必要な値を受け渡す場合には、このようにmodel:に値を設定するのが基本になります。
・GET時の処理
def arr = [最後に、POSTでない、通常のGETアクセスされた時の処理を用意しておきます。例によって変数arrに渡すデータをマップにまとめ、それを出力しています。今回はsampledataという名前でSampleDataインスタンスも渡すようにしておくのを忘れないでください。
'title':"Create Data",
'msg':"入力してください。",
sampledata:data
];
arr;
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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; }
※関連コンテンツ