131216_01:アジャイル開発本
1日1Webサイトプロジェクト始動:1日目
100日間で100のWebサイトをつくる
第10章
タスクE:もっとスマートなカート
10.1 イテレーションE1 : もっとスマートなカートの作成
この章でやること
- スキーマと既存のデータの修正
- エラーの診断と処理
- フラッシュ
- ログ
カートの基本機能は実装できたが、作業はまだまだある。
まず、ユーザが同じ商品を2個以上カートに入れていたときに認識できるようにする必要がある。
そのあとで、カート自体がエラーケースを処理し、動作中に発生した問題を状況に応じてユーザかシステム管理者に通知できるようにする。
カートの各商品に数量を対応づけるためには、line_itemsテーブルを修正する必要がある。
rails generate migration add_quantity_to_line_items quantity:integer
修正が済んだら、マイグレーションを実行
rake db:migrate
品目コントローラにも動的にファインダメソッドを作成し、それをクラスに追加。
@line_item = @cart.add_product(product.id)
さらに、showビューにも簡単な変更を加えて、新しく追加したこの情報を使う。
<li><%= item.quantity %> × <%= item.product.title %></li>
マイグレーションを作成
rials generate migration combine_items_in_cart
10.2 イテレーションE2:エラー処理
アプリケーションがcartsコントローラの16行目で例外を発生させた。例外を発生したときは、例外を無視せずに2つの処理を行う。
まず、Railsのloggerの機能を使って、エラーが発生した事実を内部ログファイるンい記録する。
次に、カタログページを再表示して、「無効なカートです」程度の短いメッセージを出力し、ユーザがサイトを利用し続けられるようにする。
Railsにはフラッシュというエラーの処理と通知に役立つ便利な機能がある。
フラッシュはバケツのようなもので、リクエストを処理する過程でオブジェクトを格納できる。
フラッシュに格納されたオブジェクトはそのセッションの次のリクエストの処理が終わるまで使うことができ、そのあとは自動的に削除される。
show( )メソッドを次のように変更する。この変更により、無効なカートidが指定された場合には例外が補足されてその問題が通知されるようになる。
# GET /carts/1
# GET /carts/1.json
def show
begin
@cart = Cart.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error "無効なカート#{params[:id]}にアクセスしようとしました"
redirect_to store_url, notice: '無効なカートです'
else
respond_to do |format|
format.html # show.html.erb
format.json { render json: @cart }
end
end
end
cart.find( )によって発生させられた例外は、rescue節で補足される。この例外ハンドラ内では次のような処理が行われる。
- Railsのloggerを使ってエラーを記録する。どのコントローラもlogger属性を持っており、ここではこの属性を使ってerrorログレベルでメッセージを記録している。
- redirect_to( )メソッドを使ってカタログ表示画面にリダイレクトする。:noticeパラメータではフラッシュに通知として格納するメッセージを指定する。
リダイレクトすることにより、ページが表示された事典でユーザのブラウザのアドレスバーに表示されるURLは、最初に指定されたhttp://.../cart/wibbleではなく、リダイレクト先のストアのURLとなる。