ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「RailsによるアジャイルWebアプリケーション開発」10章まで読了

sqliteトラップ以外は、特になし。
ので、自由課題に突入。

...例えば、カート項目に新しいフィールドを追加するといった何らかの変更を加えた場合、それによってコード全体の更新が必要になりますか?

少なくとも、CartItem to LineItemに変換する以下のコードは、フィールド追加によって影響を受けますね。

  def self.from_cart_item(cart_item)
    li = self.new
    li.product		= cart_item.product
    li.quantity		= cart_item.quantity
    li.total_price	= cart_item.price
    li
  end

セッションに格納するためのオブジェクトCart/CartItemと、DBに紐づくオブジェクトOrder/LineItemを分けたため、このコードは消せないでしょうね。
Order/LineItemをセッションに突っ込むっていう荒業がありそうですが、セッションに格納するオブジェクトをCart/Product → Cart/CartItemに変えたときにエラーが起こったように、変更時にセッションをクリアしなければならない可能性があるため、使えなさそうです。

http://pragprog.wikidot.com/pt-e-1
に色々載ってますが、さすがにこの荒業を使った例はありませんでした。

チェックアウト画面がすでに表示されているときに、サイドバーのチェックアウトボタンをクリックすると、何が起きますか。この状況でボタンを無効にする方法がわかりますか。

うーん、思いつかないので答えをみてしまった(汗
submit_toとか、button_toのオプションで、disabledってのがあるので、@orderがnilかどうかを判定してdisabledを設定するっていうやり方らしい。

<%= button_to "チェックアウト", {:action => :checkout}, {:disabled => !@order.nil?} %>
<% form_remote_tag :url => {:action => :empty_cart } do %>
  <%= submit_tag "カートを空にする on AJAX", :disabled => !@order.nil? %>
<% end %>

有効な支払い方法のリストは、現状ではOrderクラスに定数として格納されています。このリストをデータベーステーブルに移動できますか。

とりあえず、
http://pragprog.wikidot.com/pt-e-3
の通りにやってみる。
プルダウンの表示まではうまくいくが、検証処理がうまくいかない。。(必ずエラーになってしまう)
どうしたもんか。。また来週考えよう。


(2008.05.15追記)
http://pragprog.wikidot.com/pt-e-3
のページのNicolasのコメント(2つ目)をやってみたらうまくいった。
プルダウンのvalue値をpayment_typesテーブルのvalue列で設定していたのだが、これがダメだったらしい。
ordersテーブルの外部キーとしてpayment_typesのvalueではなく、payment_type_idを設定するようにしたため、プルダウンのvalue値もpayment_typesテーブルのid列を設定するようにしたということらしい。