ユーザーが投稿した全メッセージを表示する
MsgDataからPersonDataが取り出され、処理されていることがよく分かりました。@ManyToOne
は、単に関連するインスタンスが1つあるだけなので非常に分かりやすいです。では、@OneToMany
で関連付けたインスタンスの利用も行ってみましょう。先ほどのPerson用index.htmlを少し修正し、各ユーザーが投稿したメッセージまですべて表示されるようにしてみます。
#{extends 'main.html' /} #{set title:'Home' /} <h1>メッセージ表示</h1> #{list items:datas, as:'data'} <li>${data.id}: ${data.name}(${data.mail}) <ul> #{list items:data.messages, as:'message'} <li>${message.message}</li> #{/list} </ul> </li> #{/list}
コントローラーはまったく操作していません。#{list items:datas, as:'data'}
の繰り返しの中で、更に#{list items:data.messages, as:'message'}
という繰り返しを用意し、PersonDataのmessagesに設定されているListの全要素を取り出して表示しています。
モデルの連携は、このようにモデルの参照をそのままフィールドに保管しているため、SQLのように面倒な検索を行ったりする必要がありません。ただ単に、必要なインスタンスを取得すれば、それと連携するモデルのインスタンスもそのまま得ることができます。ただし、そのためには、データを作成する際、関連するモデルのインスタンスを取得しフィールドに追加するなどの操作を行っておく必要があります。このあたりは、少々面倒に感じるかもしれません。
テストについて
ある程度の規模の開発となると、重要になってくるのがテストです。Play!では、JUnitによるテストのための機能が標準で備わっています。作成した「sampleapp」プロジェクトの中を見ると、「test」というフォルダが用意されているはずです。このフォルダが、テストのためのコードを配置する場所です。そこには、標準で「ApplicationTest.java」「BasicTest.java」「Application.test.html」」というソースコードファイルが作成されています。これは、プロジェクトを作成した際に自動生成されたテスト用のソースコードで、これを修正するなどしてテストを自分なりに追加していくことが可能です。
Play!では、テストは3種類に分けられます。「UnitTest(ユニットテスト)」「FunctionalTest(ファンクショナルテスト)」「SeleniumTest(セレニウムテスト)」です。サンプルのファイルが用意されているので、それを読むことで大体どういう形で書けばいいのか分かってくるでしょう。
まずは、実際にサンプルのテストを実行してみましょう。これは、テストモードでサーバを実行して行います。コマンドプロンプトを起動し、Play!のディレクトリ(samppleappが置かれている場所)に移動します。そして、次のように実行してください。
play test sampleapp
「Running in test mode.」と表示され、テストモードでサーバが実行されます。サーバが起動したら、ブラウザから以下のアドレスにアクセスをしてください。
画面に「Tests runner」と表示されたページが現れます。ここで、それぞれのテストが一覧で表示されます。各テストは、クリックして選択できます。そして必要なテストを選択し、[Start!]ボタンを押すと、選択したテストをすべて実行します。実行結果は、各テストの項目の左にある[+]マークをクリックすることで表示できます。
Tests runnerでは、用意したテストがすべて自動的に認識され表示されるので、その中から特定のものだけを選択して実行できます。テストを集中管理するページと考えればよいでしょう。プログラマは、ただテストのコードを書いて、指定された場所に配置すればいいだけです。