配属からもう1ヶ月か〜

今日の作業

発送機能の実装

今日の作業でわかったこと&わからなかったこと

今日は発送機能を実装していくにあたり部分テンプレートやチェックボックスのオンオフにより
DB内のデータにどのような方法でマークを付けるかについてやった。
部分テンプレートについてはまずコントローラで注文情報がいろいろつまった@pending_ordersをつくり

render(:partial => "order_line", :collection => @pending_orders)

とすることで、部分テンプレートで

<%= h(order_line.name) %>

をやったら@pending_orders.nameが取り出せる。
ってかorder_line.nameじゃなくて@pending_orders.nameで取り出せた方がわかりやすい気がした。
なんでいちいち@pending_ordersをorder_lineに代入するのかが謎だった。
ここが今日一番つっかかった所。

明日やること

発送機能のまとめ
ユーザ管理

調べたことのまとめ

Railsの列名に関する命名規約

datetimeフィールドには、_atで終わる名前を、
dateフィールドには_onで終わる名前を付けることになっている。
例:

last_edited_on (最終編集日)
sent_at (送信日時)
発送機能について

今回は
未発送の注文リスト表示。
発送が完了したら、発送済みチェックを付ける。
発送済みチェックが付いているのを表示しない。
ような機能にする。

まずadmin_controller.rdに

  def ship
    @pending_orders = Order.pending_shipping
  end

を追加し、orderモデルに

  def self.pending_shipping
    find(:all, :conditions => "shipped_at is null")
  end

shipped_atがnullの全ての注文情報をとってくる。

次にビューの作成だが今回は部分テンプレートを使用。
テンプレートの一部を外部ファイルに追い出す機能。
ファイルの拡張子は通常のアクションテンプレートと同じ.rhtmlを使うが
ファイル名はアンダースコア"_"ではじめる必要がある。
まずship.rhtmlを作成する

1|<%= form_tag(:action => "ship") %>
2|<table cellpadding="5" cellspacing="0">
3|<%= render(:partial => "order_line", :collection => @pending_orders) %>
4|</table>
5|<br/>
6|<input type="submit" value="チェックマークが付いている商品を発送する" />
7|<%= end_form_tag %>

3行目のrender()で:collectionにアクションメソッドで作成した@pending_ordersを指定する。
:partialで部分テンプレートのファイル名のはじめの"_"抜きを指定。
次に部分テンプレート_order_line.rhtmlを作成

<tr valign="top">
  <td class="olnamebox">
    <div class="olname"><%= h(order_line.name) %>
	<div class="oladdress"><%= h(order_line.address) %>
  </td>
  <td class="olnamebox">
  	<% order_line.line_items.each do |li| %>
	  <div class="olitem">
		<span class="olitemqty" ><%= li.quantity %></span>
		<span class="olitemtitle"><%= li.product.title%></span>
      </div>
	<% end %>
  </td>
  <td>
  	<%= check_box("to_be_shipped", order_line.id, {}, "yes", "no") %>
  </td>
</tr>

:collectionオプションを利用することで上記のように、
@pending_order内のデータを部分テンプレート内でorder_lineという変数で参照できるようになる。
次にフォームのチェックボックスをオンした場合その項目に対応するデータベース内の注文データに、
発送済みマークを付ける。
まずチェックボックスがどのような形で宣言されているかチェック。

<%= check_box("to_be_shipped", order_line.id, {}, "yes", "no") %>

最初のパラメータはこのフィールドの名前に使われる文字列。
paramsでパラメータを取得するときにも使用。
2番目のパラメータも名前の一部分として使われる。
もし、idが「1」だった場合は、最初に指定した名前と合わさって、実際の名前は「to_be_shipped[1]」となる。
3番目のパラメータにはオプションが入る。今回は空。
その後のパラメータには、チェックボックスがオンの状態の時に使用される値、オフの状態の時に使用される値を指定。

この例の場合、idが1の注文のチェックボックスだけがオンならコントローラに返されるパラメータは

@params = {"to_be_shipped" => {"1" => "yes" }}

となる。