memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

WEBrickでcheckboxなどの複数値を受け取るには?

昨日、学生さんから授業課題について質問があって調べたのですが簡単には見つからなかったので書いておきます。

WEBrickとはなんぞや?という話は以下のような記事がありましたのでご参照ください。

WEBrickの使い方メモ - Qiita 前提 前提: Ruby 2.6 実行方法 # 本記事全般的に↓だけ > ruby xxx.rb qiita.com

以下のような簡単なプログラムがあったとします。チェックボックスを3つおいて、選択肢を表示しようとしています。このままだと、複数選択した場合、1番目の回答しか取得できません。

require 'webrick'



config = {

 :Port => 8080,

 :DocumentRoot => '.'

}



server = WEBrick::HTTPServer.new( config )

server.mount_proc "/" do |req, res|

 res.body = <<~EOS

   <!DOCTYPE html>

   <html>

     <body>

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

         <input type="checkbox" name="a" value="1">1

         <input type="checkbox" name="a" value="2">2

         <input type="checkbox" name="a" value="3">3

         <input type="submit">

       </form>

     </body>

   </html>

 EOS

end



server.mount_proc "/do" do |req, res|

 res.body = <<~EOS

   <!DOCTYPE html>

   <html>

     <body>

       #{req.query['a']}

     </body>

   </html>

   EOS

end

  

trap(:INT) do

 server.shutdown

end



server.start

「あれ?」と。

JSPでは教えた記憶があるのですが、Rubyではやった記憶がない。。。授業で扱っておきながらその内容を取得する方法について知らなかったのです。。。

フォームに入力した値はWEBrick::HTTPUtils::FormDataで管理されるとのことです。そのドキュメントを見てみました。

class WEBrick::HTTPUtils::FormData (Ruby 3.0.0 リファレンスマニュアル) クライアントがフォームへ入力した値を表すクラスです。multipart/form-data なデータを表すのにも 使われま docs.ruby-lang.org

上記に以下の記述があります。.listって書けば配列データが取り出せるんですね。。。なるほどぉ〜。

スクリーンショット 2021-06-09 13.54.19

ということで、以下のように1行だけですが、書き換えればよかったよ〜ということでした。はい。



require 'webrick'



config = {

 :Port => 8080,

 :DocumentRoot => '.'

}



server = WEBrick::HTTPServer.new( config )

server.mount_proc "/" do |req, res|

 res.body = <<~EOS

   <!DOCTYPE html>

   <html>

     <body>

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

         <input type="checkbox" name="a" value="1">1

         <input type="checkbox" name="a" value="2">2

         <input type="checkbox" name="a" value="3">3

         <input type="submit">

       </form>

     </body>

   </html>

 EOS

end



server.mount_proc "/do" do |req, res|

 res.body = <<~EOS

   <!DOCTYPE html>

   <html>

     <body>

       #{req.query['a'].list} #変更箇所(.listを付加しました)

     </body>

   </html>

   EOS

end

  

trap(:INT) do

 server.shutdown

end



server.start

おしまい。