MsgDataのコントローラー
続いて、MsgDataを修正していきましょう。まずはコントローラークラスからです。これも、indexとaddの2つだけを用意しておくことにします。
package controllers;
import java.util.List;
import models.*;
import play.mvc.Controller;
public class Application extends Controller {
public static void index(String name) {
List<MsgData> datas = null;
datas = MsgData.findAll();
render(datas);
}
public static void add(String message,String name){
String msg = "データを入力下さい。";
if (request.method.equals("POST")) {
PersonData person = PersonData.find("name",name).first();
if (person != null){
MsgData data = new MsgData(message,person);
data.save();
person.save();
msg = "データを保存しました。";
} else {
msg = "個人データが未登録です。";
}
}
render(msg);
}
}
indexは、findAllしたものをrenderに渡しているだけなので、説明無用でしょう。ポイントはaddです。今回、MsgDataをただ登録するだけでなく、お互いの連携用に用意されたフィールドに必要な参照を保管する処理も行わなければいけません。では、addでPOSTされた場合の処理を見てみましょう。
PersonData person = PersonData.find("name",name).first();
まず、投稿されたnameでPersonDataインスタンスを検索し取得します。単純に、あるフィールドの値がある値のものを検索するなら、findメソッドでフィールド名と値を渡すだけです。クエリーを書く必要はありません。またその後にあるfirstは、取得したデータから最初のものを取り出し返す働きをします。
これで、入力されたnameのPersonDataが得られました。これがnullだった場合には、データが未登録であるとして処理します。見つかった場合には、これを使ってMsgDataインスタンスを作成し、修正したインスタンスを保存します。
data.save(); person.save();
これで、関連するモデルのインスタンスを保持した形でモデルが作成できました。
MsgData用テンプレートの作成
後は、テンプレートを作成するだけです。「Application」にあるindex.html/add.htmlをそれぞれ修正しましょう。
・index.htmlのリスト
#{extends 'main.html' /}
#{set title:'Home' /}
<h1>メッセージ表示</h1>
#{list items:datas, as:'data'}
<li>${data.id}: ${data.message}(${data.person.name}, ${data.person.mail})</li>
#{/list}
・add.htmlのリスト
#{extends 'main.html' /}
#{set title:'Home' /}
<h1>メッセージの作成</h1>
${msg}
<form method="post" action="@{Application.add}">
<table>
<tr><td>name:</td><td><input type="text" id="name" name="name" /></td></tr>
<tr><td>message:</td><td><input type="text" id="message" name="message" /></td></tr>
<tr><td></td><td><input id="submit" type="submit" value="送信" /></td></tr>
</table>
</form>


これで完成です。http://localhost:9000/addからデータを登録してみましょう。入力された名前をもとに、既にPersonDataが登録済みかをチェックし、未登録であればデータは作成されません。また、http://localhost:9000/では、登録されたメッセージとユーザー名、そしてメールアドレスが表示されます。MsgDataには、nameやmailの情報はありません。これらは、保管されたPersonDataから取り出して表示しているのです。名前の表示部分を見ると、${data.person.name}というようにして、MsgDataのpersonフィールドに保管されているPersonDataのnameを出力していることがよく分かります。
