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
体重・体脂肪率・メモ入力をして、「送信する」ボタンを押下すると履歴一覧の表に追加される。
しかし、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