RubyでECS4.0アプリを作る。フォームからデータ取得。
Rubyを勉強しようと思って5月末頃にRubyプログラミング基礎講座を購入。少し読んでみたが思ったより詳しくのってないなぁ。と今まで放置気味だったけどこのままじゃあかんと思いAmazon E-Commerce Service 4.0をベースにしたWebアプリを勉強がてらRubyで作ってみることにしました。少しずつ進めていきます。
今回はHTMLのフォーム画面から検索語句とカテゴリを受け取ってそれをHTMLで表示するって所です。ここではHTMLファイル及びrubyプログラムはutf8で保存しています。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Amazon検索</title>
</head>
<body>
<h1>Amazon検索</h1>
<form action="./search.rb" method="post">
<input type="text" name="keyword" value="" size="20" />
<select name="mode">
<option value="Blended">すべての商品</option>
<option value="Books">和書</option>
<option value="ForeignBooks">洋書</option>
<option value="Electronics">エレクトロニクス</option>
<option value="Kitchen">ホーム&キッチン</option>
<option value="Music">ポピュラー音楽</option>
<option value="Classical">クラシック音楽</option>
<option value="DVD">DVD</option>
<option value="VHS">ビデオ</option>
<option value="Software">ソフトウェア</option>
<option value="VideoGames">ゲーム</option>
<option value="Toys">おもちゃ</option>
</select>
<input type="submit" value="検索する" /><br />
</form>
</body>
</html>
HTMLのフォームは↑のような感じです。検索語句がkeyword、カテゴリがmodeとなっています。
環境変数ENVを利用してフォームデータを取得する場合
とりあえずCGIクラスを使わないで環境変数ENVを使ってフォームデータを受け取る場合を最初に見てみます。
if ENV['REQUEST_METHOD'] == "POST" then indata = $stdin.read ENV['CONTENT_LENGTH'].to_i else indata = ENV['QUERY_STRING'] end
これでフォームがPOSTとGETの両方で受け取ることができます。変数indataにはkeyword=xxx&modexxxというようにkeywordとmodeが&でつながれて格納されています。これだと各々の値を参照できませんので&で分けてkeywordとmodeそれぞれに分けます。分けるのはsplit関数を使います。
tmp = indata.split("&")
これで配列tmpに各々の値が入ります。tmp[0]にkeyword=xxx、temp[1]にmode=xxxが入ってます。配列じゃなくて普通の変数に入れたい場合は
(tmp1, tmp2) = indata.split("&")
です。これで2つのデータに分かれましたがkeyword=xxxとなっているので次は"="で分ける必要があります。俺はデータが配列tmpに入っていたほうがやりやすいのでそちらを使います。
FORM = Hash.new
tmp = indata.split("&")
for j in tmp
(name, value) = j.split("=")
FORM[name] = value
end
配列tmpのデータ、tmp[0]="keyword=xxx"、tmp[1]="mode=xxx"をループ処理で取り出してハッシュに入れ込みます。処理後はFORM["keyword"]とFORM["mode"]でそれぞれの値にアクセスできます。配列のループ処理にforを使いましたがeachを使っても同様の処理が出来ます。
tmp.each do |j| -- 処理 -- end
これでkeywordとmodeの値をそれぞれ取得することが出来ました。ただこのままですと検索語句に日本語を使うとuriエンコードされた物が入っています。例えば検索語句が「宇多田」の場合は「%E5%AE%87%E5%A4%9A%E7%94%B0」です。これだと都合悪いのでuriクラスのdecord関数を使って戻します。
require "uri"
keyword = uri.decode(str)
これで今回のテーマであるフォームデータから検索語句を取得できましたので、環境変数ENVを利用したフォームデータ取得のRubyプログラムは以下です。
(example01)
#!/usr/local/bin/ruby
require "uri"
if ENV['REQUEST_METHOD'] == "POST" then
indata = $stdin.read ENV['CONTENT_LENGTH'].to_i
else
indata = ENV['QUERY_STRING']
end
FORM = Hash.new
tmp = indata.split("&")
for j in tmp
(name, value) = j.split("=")
FORM[name] = URI.decode(value)
end
exit
CGIクラスを利用したフォームデータの取得
続いてはRubyに標準で添付されているCGIクラスを利用してみます。CGIクラスはCGIプログラムの支援ライブラリです。CGIクラスを使うことによって簡単にフォームデータにアクセスできるようにあります。
require "cgi"
cgi=CGI.new
と.newでインスタンスを作成して temp = cgi["フィールド名"] といった感じで直接取得することが出来ます。今回の場合ですと。
keyword = cgi["keyword"] mode = cgi["mode"]
で各々の値を取得できます。そのままハッシュに入れるのもOKですが、CGIクラスには直接ハッシュで値を取得もできるようです。
FORM = cgi.params
とやればFORMにハッシュで取得できます。環境変数ENVを使ったときには値がuriエンコードされてましたがcgiクラスだと最初からでコードされて取得することができます。ということで今回はフォームデータなどはハッシュに入れて処理したいと思いますので以下のようなコードになります。
(example02) #!/usr/local/bin/ruby require "cgi" cgi=CGI.new FORM = cgi.params exit
example01と比べるとずいぶんとスッキリしました。どちらも同じように
FORM = { "keyword" => "xxx", "mode" => "xxx"}
とFORMにフォームデータが入ってます。CGIクラスには他にも便利な機能があるみたいですが今回の記事ではここまでにします。
さてとりあえずフォームデータの取得はできるようになりました。次回は取得したフォームデータを組み立ててAmazon E-Commerce Service 4.0へアクセスして、商品の検索データを取り込むまでを書いてみたいと思います。
こうして組んだほうがいいんじゃないかとかありましたらコメントやTBしてくださると勉強になって助かります。

コメント