第?部 アプリケーションを構築する

第8章 タスクC:カートの作成

この章は長かった・・
ショッピングカートの実装です。
ショッピングカートに商品を追加したり一覧表示したりしますよ。

セッション

ショッピングカートってことで、セッションにカートのデータは保持します。
Railsはセッションをサーバ上のファイルに保存するらしい。
複数サーバでセッションを共有したいときはどーすんの?っていうのは第22章で詳しく触れられているもよう。そこまでいくのはいつかね。

セッションのカートを取得するコードはこんなかんじ。

private 
def find_cart
  session[:cart] ||= Cart.new
end

これでCartクラスのインスタンスをかえすのかね!
戻り値は書かなくてもいいのか。

=は条件付代入演算子Rubyの文法らしい。フーム。


CartはActionRecord::Baseのサブクラスにしません。
データベースに保存しないからね。

モデル間の関連

つぎにCartの中で持つ商品ごとの数量を保持するLineItemクラスを作ります。
LineItemはProduct(商品)のidを参照するモデルです。
Product:LineItem = 1:N


LineItemのコードは

class LineItem < ActiveRecord::Base
  belongs_to :product
end

こんな感じ。script/generateでLineItemを作った後、belongs_to〜を追加するだけです。


あとは・・・
同じ商品を追加されたときに数量と合計額だけカウントアップするとか
URL直打ちされたときの対応をするとかのコードを追加します。


エラーハンドリング

Railsではメッセージを表示するのにFlashというハッシュを使います。
Flashはセッションに保持されます。
ログはloggerというオブジェクトが用意されている。
使い方はこんな感じ。

def add_to_cart
  .....
rescue
  logger.error("無効な商品 #{params[:id]}にアクセスしようとしました")
  flash[:notice] = '無効な商品です'
  redirect_to(:action => 'index')
end

ログはlogディレクトリ内のdevelopment.logに書かれてます。
Flashはビューで以下のように参照します。

  <%= @flash[:notice] %>

こんだけ。
で、ページ全体で一貫性を持たせてメッセージを表示するエリアをインラインでとっておくのにはlayout/以下のコントローラー名をつけたrhtmlに書いておく。


エラーのときはindexページ(コントローラーのindexメソッド実行)にリダイレクトするようにしています。
これでF5押されてもOK。

そんで

カートを空にするコードもかいときます。


ヘルパー

Railsではビューに自動的にincludeするコードをapp/helpers/hogehoge_helper.rbに書くことができます。
ビューではここで定義されたメソッドをそのまま使うことができます。


うーん、長かった。
次章はチェックアウト!
カートの内容を確定して購入するとこに入ります。



RailsによるアジャイルWebアプリケーション開発
RailsによるアジャイルWebアプリケーション開発前田 修吾

オーム社 2006-02-25
売り上げランキング :


Amazonで詳しく見る
by G-Tools