さて、前回は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 end
upメソッドに: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の略で、詳しくはこちらをご参考に。
それでは、今回はここまで。
次回は、さらに管理アプリケーションをいじっていきます。