このエントリはPlay frameworkひとりアドベントカレンダーの24日目です。
今日は /admin/order.csv
を実装します。CSVダウンロードです。
今日も今までと同じ流れでいきましょう。
- 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
- modelを作る
- viewを作る
- controllerを作る(TODOでよい)
- 表示確認
- controllerを作りこむ
元コード
get '/admin/order.csv' => sub { my ($self, $c) = @_; $c->res->content_type('text/csv'); my $orders = $self->dbh->select_all( 'SELECT order_request.*, stock.seat_id, stock.variation_id, stock.updated_at FROM order_request JOIN stock ON order_request.id = stock.order_id ORDER BY order_request.id ASC', ); my $body = ''; for my $order (@$orders) { $body .= join ',', @{$order}{qw( id member_id seat_id variation_id updated_at )}; $body .= "\n"; } $c->res->body($body); $c->res; };
- クエリを実行して,で連結して出力
- Content-Typeはtext/csv
ってなもんですね。
PlayでレスポンスのContent-Typeを指定するには response().setContentType
を使います。
ここまで毎日やってれば、他に迷うことはないでしょう。
public static Result adminOrderCSV() { response().setContentType("text/csv"); List sqlRows = Ebean .createSqlQuery( "SELECT order_request.*, stock.seat_id, stock.variation_id, stock.updated_at" + " FROM order_request JOIN stock ON order_request.id = stock.order_id" + " ORDER BY order_request.id ASC").findList(); StringBuffer buffer = new StringBuffer(); for (SqlRow sqlRow : sqlRows) { buffer.append(sqlRow.get("member_id")); buffer.append(","); buffer.append(sqlRow.get("seat_id")); buffer.append(","); buffer.append(sqlRow.get("variation_id")); buffer.append(","); buffer.append(sqlRow.get("updated_at")); buffer.append("\n"); } return ok(buffer.toString()); }
できましたか?これで全機能が完成です。
Play framework ひとりアドベントカレンダーはこれでおしまいです。
ここまで読んでいただいたかた、ありがとうございました。お疲れさまでした。
最近はあんまりviewはがんばらなくて、JSONを返すだけでOKなシーンが多いと思います。
Javaでさくさくと作れるPlayをぜひ試してみてください!
ちなみに今回のisucon2アプリのplay版はgithubにpushしてあります(playブランチ)。
→https://github.com/netmarkjp/isucon2/tree/play
みんなisucon3が開催されたら参加してみるといいよ。楽しいから!(・∀・)