さて、前回はproductモデルの作成が完了したところまででした。
今回はデータベースをいじります。
・列の追加
前回の画面からnew productを押すとこの画面が現れます。
これは商品情報を表しているのですが、このままではある情報が足りません。
価格情報が足りないのです、なのでデータベースに足りない分の列を作成しましょう。
その際にマイグレーションを使って追加してみます。
コマンドは以下です。
>ruby script/generate migration add_price_to_product price:decimal
ちなみにここで記載されているdecimalはデータの型であり、priceの列はdecimal型ですよという宣言をしています。
そして、このコマンドを実行すると以下の結果が出ます。
>db/migrate >db/migrate/○○_add_price_to_product.rb
ここで、○○_add_price_to_product.rbというファイルが作られているので参照すると。
class AddPriceToProduct < ActiveRecord::Migration
def self.up
add_column :products, :price, :decimal
end
def self.down
remove_column :products, :price
end
endこれは、upメソッドとdownメソッドでそれぞれ列を追加したり消したりしているわけです。
次に、このファイルに少し手を加えます。
class AddPriceToProduct < ActiveRecord::Migration
def self.up
add_column :products, :price, :decimal,
:precision => 8, :scale => 2, :default => 0
end
def self.down
remove_column :products, :price
end
endupメソッドに:precision => 8, :scale => 2, :default => 0が加えられました。
これはdecimal型で加えたpriceの内容の定義をしているのです。
precisionは有効桁が8桁、scaleは有効桁数の内2桁を小数点以下に振り分け、defaultは初期値を意味しています。
そして、これをrake db:migrateします。
・日本語化&エスケープの削除
その後、index.html.erbを以下のように。
<h2>製品一覧</h1>
<table>
<tr>
<th>名称</th>
<th>説明</th>
<th>画像URL</th>
<th>価格</th>
</tr>
<% for product in @products %>
<tr>
<td><%=h product.title %></td>
<td><%=h product.description %></td>
<td><%=h product.image_url %></td>
<td><%=h product.price %></td>
<td><%= link_to '表示', product %></td>
<td><%= link_to '編集', edit_product_path(product) %></td>
<td><%= link_to '破棄', product, :confirm => '本当に破棄しますか?', :method => :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to '新しい商品', new_product_path %>と、new.html.erbを。
<h1>新しい商品</h1>
<% form_for(@product) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.label :image_url %><br />
<%= f.text_field :image_url %>
</p>
<p>
<%= f.label :price %><br />
<%= f.text_field :price %>
</p>
<p>
<%= f.submit "作成" %>
</p>
<% end %>
<%= link_to '戻る', products_path %>と変更し、edit.html.erbを
<h1>商品の表示</h1>
<% form_for(@product) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.label :image_url %><br />
<%= f.text_field :image_url %>
</p>
<p>
<%= f.label :price %><br />
<%= f.text_field :price %>
</p>
<p>
<%= f.submit "更新" %>
</p>
<% end %>
<%= link_to '表示', @product %> |
<%= link_to '戻る', products_path %>とし、最後にshow.html.erbを
<p> <b>名称:</b> <%=h @product.title %> </p> <p> <b>説明:</b> <%=h @product.description %> </p> <p> <b>画像URL:</b> <%=h @product.image_url %> </p> <p> <b>価格:</b> <%=h @product.price %> </p> <%= link_to '編集', edit_product_path(@product) %> | <%= link_to '戻る', products_path %>
と変更します。
変更点はそれぞれpriceの項を加えたことと、英語を日本語にしたことです。
最後に、さきほどのshow.html.erbを更に変更してみます。
さきほどの説明の項の<%=h @product.description %>ではマークアップをした際にそのまま表示されてしまいます。
しかし、hを抜いて<%= @product.description %>とするとマークアップも反映されるので、
となります。
hはhtml_escapeの略で、詳しくはこちらをご参考に。
それでは、今回はここまで。
次回は、さらに管理アプリケーションをいじっていきます。


