このエントリはPlay frameworkひとりアドベントカレンダーの23日目です。
今日は /admin
を実装します。
今日も今までと同じ流れでいきましょう。
- 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
- modelを作る
- viewを作る
- controllerを作る(TODOでよい)
- 表示確認
- controllerを作りこむ
get '/admin' => sub { my ($self, $c) = @_; $c->render('admin.tx') }; post '/admin' => sub { my ($self, $c) = @_; open(my $fh, 'root_dir . '/../config/database/initial_data.sql') or die $!; for my $sql () { chomp $sql; $self->dbh->query($sql) if $sql; } close($fh); $c->redirect('/admin') };
modelいらない、viewたいしたことない、というわけで、controllerをがんばりましょう。
といってもファイルからSQLを読み込んでがーっと流すだけです。
Ebean.createCallableSql
を利用してがんがん流しましょう。
public static Result adminIndex() { return ok(views.html.admin.render()); } public static Result adminIndexPost() { try { BufferedReader reader = new BufferedReader(new FileReader( "../config/database/initial_data.sql")); String line; Ebean.beginTransaction(); while ((line = reader.readLine()) != null) { if (line.isEmpty()) { continue; } Ebean.execute(Ebean.createCallableSql(line)); } Ebean.execute(Ebean.createCallableSql("commit;")); Ebean.commitTransaction(); } catch (FileNotFoundException e) { Logger.error(e.getMessage()); Logger.error(e.getStackTrace().toString()); } catch (IOException e) { Logger.error(e.getMessage()); Logger.error(e.getStackTrace().toString()); } finally { Ebean.endTransaction(); } return found("/admin"); }
return ok
以外は初登場かも。 return found
なんてものがあるので使いましょう。
なお、↑のコードでは EBean.createCallableSql("commit;")
と Ebean.commitTransaction
で2回コミットしてます。
本当は2回もいらないような気がするのですが、なんか試してるうちにこうじゃないと動かなかったのでこうしてます。
なんでかはわからんちん。なんでや。。。