131213_03:アジャイル開発本
8.1 イテレーション C1 : カタログリストの作成
支払いをする顧客との対話を扱うコントローラ(Store)を作る。
depot> rails generate controller Store index
config/routes.rbを編集
root to: 'store#index', as: 'store'
コメントの指示通り、public/index.htmlを削除
depot> rm public/index.html
ブラウザに接続
商品のリストをデータベースから取り出し、テーブルを表示するビュー内のコードに渡すために、store_controller.rb内のindexメソッドを変更。
@products = Product.order(:title)
を追加
次にビューのテンプレートを記述
app/views/storeのファイルindex.html.erbを編集
<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>
<h1>Pragmaticカタログ</h1>
<% @products.each do |product| %>
<div class="entry">
<%= image_tag(product.image_url) %>
<h3><%= product.title %></h3>
<div class="price_line"
<span class="price"><%= product.price %></span>
</div>
</div>
<% end %>
次にスタイルシートを追加。
StoreControllerによって生成されるぺーじがstoreという名前のHTMLのクラスを定義することを利用。
8.3 イテレーションC3 : ヘルパーを使った価格のフォーマット
depot/app/views/stre/index.html.erbの
<span class="price><%= product.price %></span>
を
<span class="price"><%= number_to_currency(product.price) %></span>
に変更。
適切にフォーマットされた価格が表示されるようになる。
8.4 イテレーションC4 : コントローラの機能テスト
ここまでの作業で何も壊していないことを確認するためにテストを行う。
depot> rake test
うまくいった。
以前のテストはメソッドを呼び出して返されたものが期待どおりだったかを確認するだけの単純なもの。
今回はサーバによるリクエストの処理や、ユーザのブラウザに表示されるレスポンスが相手。モデル、ビュー、コントローラが正しく連携していることを確認する機能テスト。
test/functional/store_controller_test.rbに
assert_select '#colums #side a', minimum: 4
assert_select '#main .entry', 3
assert_select 'h3', 'Programming Ruby 1.9'
assert_select '.price', /\$[,\d]+\.\d\d/
の4行を追加
この4行は、CSSセレクタの表記を使って、返されたHTMLの中身を調べている。
先頭がシャープのセレクタはid属性に一致し、先頭がドットのセレクタはクラス属性に一致。プリフィックスがないセレクタは要素名に一致。
assert_selectに関しては
http://api.rubyonrails.org/classes/ActionDispatch/Assertions/SelectorAssertions.html
を参照
--------
この章では、オンラインストアのカタログ画面の基礎を作成した。
- 顧客とのやりとりを行うための新しいコントローラを作成
- デフォルトのindex( )アクションを実装
- Webサイトに商品の並べる順番を制御するため、Productsコントローラ内にorder( )メソッドの呼び出しを追加
- ビューと、それに適用するレイアウトを実装
- ヘルパーを使って価格を思い通りにフォーマットする。
- CSSスタイルシートを利用
- コントローラ用の機能テストを作成
メモ
書籍に掲載されいているサンプルコード
http://www.ohmsha.co.jp/data/link/978-4-274-06866-9/