みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

チェックボックスについて(ruby)

cgiのプログラムでチェックボックスについてわからないことがあります。 今書いてある、プログラムだとすべての値を受け取ってしまいます。 選択されたものだけ表示させるようにさせたいと思っています。そのプログラムfor文で書いているのですが、どのように書いたらよいのでしょうか? 教えてください、お願いします!

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>プロフィール入力ページ</title>
</head>
<body>
プロフィールを入力してください。<br>
<form method="GET" action="http://profile2.cgi">
名前: <input type="text" name="name">
<br>
<br>
性別: <input type="radio" name="sex" value="男性">男
<input type="radio" name="sex" value="女性">女
<input type="radio" name="sex" value="その他">その他

<br>
<br>
趣味: <input type="checkbox" name="hobby" value="映画">映画
<input type="checkbox" name="hobby" value="音楽">音楽
<input type="checkbox" name="hobby" value="スポーツ">スポーツ
<input type="checkbox" name="hobby" value="料理">料理
<input type="checkbox" name="hobby" value="その他">その他
<br>
<br>
<br>
<input type="submit" value="送信">
</form>
</body>
</html>

#!/usr/local/bin/ruby
print "Content-type: text/html; charset=euc-jp\n\n"
$KCODE = "e"
require "cgi"

cgi = CGI.new
namae = cgi["name"]
sei = cgi["sex"]
syumi = cgi.params["hobby"]

ary = ["映画, ", "音楽, ", "スポーツ, ", "料理, ", "その他 "]
str = ary[0] + " " + ary[1] + " " + ary[2] + " " + ary[3] + " " + ary[4] + " "
syumi = ""
for x in str
syumi = syumi + x
end

print <<EOS
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>プロフィールの確認</title>
</head>
<body>
名前: #{namae}
<br>
<br>
性別: #{sei}
<br>
<br>
趣味: #{syumi}
</body>
</html>
EOS

動作環境はruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]になります。

投稿日時 - 2011-12-20 14:20:19

QNo.7200185

すぐに回答ほしいです

質問者が選んだベストアンサー

何をしているのか理解できないところがあるので、
まず
syumi = cgi.params["hobby"]
で上の方の
趣味: <input type="checkbox" name="hobby(以下省略)
のチェックしている状態を受け取っているのですよね。
(CGIを使ったことはないのでチェックしたものはどのような形式で受け取るのでしょうか?
Hash? Array?が分かれば考えやすいのですが)

それはともかく、
その後の
syumi = ""
で折角受け取ったデータを消ししまっているのです。
その後の
for x in str
syumi = syumi + x
end
でstrはforの前で
"映画, 音楽, スポーツ, 料理, その他 "
ですので、forは1回しか回らず、syumiにそのまま入れて終了しています。
要するに、 cgi.params["hobby"]で受け取った値を捨ててしまっています。

投稿日時 - 2011-12-20 18:07:27

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

たびたびすみません。
No.2の訂正は完全な間違いですねえ。ちゃんと確認してから書くべきでした。
forで文字列を使ったときの挙動はNo.1の記述が正解でした。
each_line(=each)と同じように行で分けられるのでした。No.2ではeach_charと同じような挙動だと勘違いしていました。

投稿日時 - 2011-12-21 00:23:57

ANo.2

No.1の訂正です。
>forは1回しか回らず、syumiにそのまま入れて終了しています。
1回しかというところは間違いでした。strは配列ではなく文字列ですので一文字ずつxに渡されます。どっちみち結果は同じですが。

syumi = cgi.params["hobby"]
でチェックボックスの名前が返ってこないのなら、それをもとに
ary = ["映画, ", "音楽, ", "スポーツ, ", "料理, ", "その他 "]
から抽出すればよいということになります。

投稿日時 - 2011-12-20 22:07:18

あなたにオススメの質問