第?部 アプリケーションを構築する
第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アプリケーション開発 | |
前田 修吾 オーム社 2006-02-25 売り上げランキング : Amazonで詳しく見る by G-Tools |