読者です 読者をやめる 読者になる 読者になる

生涯未熟

プログラミングをちょこちょこと。

RailsによるアジャイルWEBアプリケーション開発第3版勉強!#2

Ruby on Rails

さて、前回は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の略で、詳しくはこちらをご参考に。



それでは、今回はここまで。
次回は、さらに管理アプリケーションをいじっていきます。