Hitsuji_monのブログ~ 村上春樹のあれ ~

文学好きな組み込み系エンジニア

【#100DaysOfCode】Day16 「作りながら学ぶRuby入門」23章

昨日はサボり。ついに途切れた
 100日間連続でコードを書くことはできなかった
まあしゃーない

Day16

「作りながら学ぶRuby入門」23章 WEBrickでWebサーバを作る

今日のpoint

  • プログラムをWebページの形(HTML)にする: 「テンプレート」を使う
  • eRuby : テキストにRubyのプログラムを埋め込むための仕様
.erb <% %>, 行頭に% をつける => Rubyのコードとして認識される
  • ターミナル: erb example.erb

WEBrickを使ったプログラムに対し、ERBを使えるように設定する手順


1. ERBHandlerへの関連付け

拡張子が 「.erb」の場合に、ERBHandlerに処理を任せるようにする

WEBrick::HTTPServlet::FileHandler.add_handler("erb", WEBrick::HTTPServlet::ERBHandler)


2. ERBでの処理結果をhtmlとみなすように設定

Webブラウザが .erb のファイルをURLで指定した場合,
HTMLで渡されるのと同じようになるように、Webブラウザに知らせる

# erbのMIMEタイプを設定
server.config[:MimeTypes]["erb"] = "text/html"



これらを踏まえて、WEBrickを使ったWebサーバープログラムが以下のようになる。

# 作りながら学ぶRuby入門 23章
require 'webrick'               # WEBrickライブラリを使用

config = {
  :Port => 8099,
  :DocumentRoot => '.',         # カレントディレクトリを表す
  }

# 拡張子erbのファイルをERBを呼び出して処理するERBHandlerと関連付ける
WEBrick::HTTPServlet::FileHandler.add_handler("erb", WEBrick::HTTPServlet::ERBHandler)

# WEBrickのHTTP Serverクラスのサーバーインスタンスを作成する
server = WEBrick::HTTPServer.new( config )

# erbのMIMEタイプを設定
server.config[:MimeTypes]["erb"] = "text/html"

# Ctrl-C割り込みがあった場合にサーバーを停止する処理を登録しておく
trap(:INT) do
  server.shutdown
end

# 上記記述の処理をこなすサーバーを開始する
server.start


次に、このサーバーでデータベースの内容を照会して、
HTMLに成形するためのテンプレートのコードが以下のようになる。

<% require 'rubygems' # RubyGemsでインストールしたときには記述  %> 
<% require 'dbi'      # DBIを使う %>

<%# データベース'fruits01.db'に接続する %>
<% dbh = DBI.connect( 'DBI:SQLite3:fruits01.db' ) %>

<%# テーブルからデータを読み込んで表示する %>
<%# select文の実行 %>
<% sth = dbh.execute("select * from products") %>
<html><body>
<%# select文の実行結果を1件ずつrowに取り出し、繰り返し処理する %>
<ul>
<% sth.each do |row| %>
<%# each_with_nameメソッドで値と項目名を1件分ずつ取り出して表示する %>
<%   row.each_with_name do |val, name| %>
      <li><%= "#{name}: #{val.to_s}" %></li>
<%   end %>
<hr>
<% end %>
</ul>
</body></html>
<%# 実行結果を解放する %>
<% sth.finish %>

<%# データベースとの接続を終了する %>
<% dbh.disconnect %>