SinatraとSequelとERBの練習(2)

今まで勉強したSinatraとSequelとERBを使って、体重・体脂肪率の一覧のようなものを作ってみた。

ERBファイル(test.erb)

<form method="post" action="">

<p>体重:<input type="text" name="weight" size="6" maxlength="5">Kg  体脂肪率:<input type="text" name="fat" size="6" maxlength="5">%</p>
<p>メモ:<input type="text" name="memo" size="40" maxlength="20"></p>
<p><input type="submit" value="送信する"></p>

</form>

<h3>履歴一覧</h3>
<table border="1">
<tr>
<th>体重(Kg)</th>
<th>体脂肪率(%)</th>
<th>メモ</th>
</tr>
<% @messages.each do |message| %>
<tr>
  <% message.each do |col| %>
  <td><%= col %></td>
  <% end %>
</tr>
<% end %>
</table>

RBファイル(test.rb)

require 'sinatra'
require 'erb'
require 'rubygems'
require 'sequel'

DB = Sequel.sqlite

#itemsテーブルを作成
DB.create_table :items do
  primary_key :id
  Float :weight
  Float :fat
  String :memo
end

items = DB[:items]

get '/' do
  @messages = items.all
  erb :test
end

post '/' do
  items.insert(:weight => params[:weight],:fat => params[:fat],:memo => params[:memo])
  @messages = items.map{|r| [r[:weight],r[:fat],r[:memo]]}
  erb :test
end

f:id:ayaketan:20111222210556j:image
体重・体脂肪率・メモ入力をして、「送信する」ボタンを押下すると履歴一覧の表に追加される。


しかし、eachが2つあるなど、見にくい点があったので、改良を行った。
ERBファイル(test.erb)

<form method="post" action="">

<p>体重:<input type="text" name="weight" size="6" maxlength="5">Kg  体脂肪率:<input type="text" name="fat" size="6" maxlength="5">%</p>
<p>メモ:<input type="text" name="memo" size="40" maxlength="20"></p>
<p><input type="submit" value="送信する"></p>

</form>

<h3>履歴一覧</h3>
<table border="1">
<tr>
<th>体重(Kg)</th>
<th>体脂肪率(%)</th>
<th>メモ</th>
</tr>
<% @rows.each do |row| %>
<tr>
  <td><%= row[:weight] %></td>
  <td><%= row[:fat] %></td>
  <td><%= row[:memo] %></td>
</tr>
<% end %>
</table>

RBファイル(test.rb)

require 'sinatra'
require 'erb'
require 'rubygems'
require 'sequel'

DB = Sequel.sqlite

#itemsテーブルを作成
DB.create_table :items do
  primary_key :id
  Float :weight
  Float :fat
  String :memo
end

items = DB[:items]

get '/' do
  @rows = items.all
  erb :test
end

post '/' do
  items.insert(:weight => params[:weight],:fat => params[:fat],:memo => params[:memo])
  @rows = items.all
  erb :test
end


さらにクラスを使って書きなおしてみた。
ERBファイル(test.erb)

<form method="post" action="">

<p>体重:<input type="text" name="weight" size="6" maxlength="5">Kg  体脂肪率:<input type="text" name="fat" size="6" maxlength="5">%</p>
<p>メモ:<input type="text" name="memo" size="40" maxlength="20"></p>
<p><input type="submit" value="送信する"></p>

</form>

<h3>履歴一覧</h3>
<table border="1">
<tr>
<th>体重(Kg)</th>
<th>体脂肪率(%)</th>
<th>メモ</th>
</tr>
<% @rows.each do |row| %>
<tr>
  <td><%= row.weight %></td>
  <td><%= row.fat %></td>
  <td><%= row.memo %></td>
</tr>
<% end %>
</table>

RBファイル(test.rb)

require 'sinatra'
require 'erb'
require 'rubygems'
require 'sequel'

DB = Sequel.sqlite

#itemsテーブルを作成
DB.create_table :items do
  primary_key :id
  Float :weight
  Float :fat
  String :memo
end

class Items < Sequel::Model
end

get '/' do
  @rows = Items.all
  erb :test
end

post '/' do
  Items.insert(:weight => params[:weight],:fat => params[:fat],:memo => params[:memo])
  @rows = Items.all
  erb :test
end


データベースのテーブルを毎回作っていたが、テーブルが存在しない時だけテーブルを作成するように作り直した。

RBファイル(test.rb)

require 'sinatra'
require 'erb'
require 'rubygems'
require 'sequel'

DB = Sequel.connect("sqlite://test.db")

class Items < Sequel::Model
  unless DB.table_exists?(:items)
    DB.create_table(:items) do
      primary_key :id
      Float :weight
      Float :fat
      String :memo
    end
  end
end

get '/' do
  @rows = Items.all
  erb :test
end

post '/' do
  Items.insert(:weight => params[:weight],:fat => params[:fat],:memo => params[:memo])
  @rows = Items.all
  erb :test
end