情報学部 菅沼ホーム 目次 索引

Ruby と CGI

  1. 一般的方法
  2. CGI クラスの利用

  1. 一般的方法

      Ruby を CGI として利用する場合,その方法は,Perl などとほとんど同じです.まず,1 行目において,

    #!/usr/bin/ruby

    のように,実行する Ruby プログラムの絶対パスを指定した後,Ruby のプログラムを書くことになります.Ruby のプログラムにおいては,送信されてきたデータを標準入力から入力し,結果を標準出力に出力することになります.出力を行う前に,

    "Content-type: text/html\n\n"
    "Content-type: text/plain\n\n"

    などのように,出力結果に対する指定( HTTP header )を忘れないようにして下さい.

      ここでは,「フォームの例1」を例として,説明を行っていきます.「フォームの例1」においては,FORM 要素の中で,CGI プログラムとして test_gets.cgi を,また,送信フォームの MIME タイプ( ENCTYPE 属性)として text/plain を指定しています.test_gets.cgi の内容は以下に示す通りです.

    #!/usr/bin/ruby
    
    $KCODE = "UTF8"
    printf "Content-type: text/html\n\n"
    printf "<HTML>\n"
    printf "<HEAD>\n"
    printf "	<TITLE>CGIB の例</TITLE>\n"
    printf "	<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\"../../../master.css\">\n"
    printf "</HEAD>\n"
    printf "<BODY CLASS=\"white\">\n"
    while line = gets
    	printf "%s<BR>\n", line
    end
    printf "</BODY>\n"
    printf "</HTML>\n"
    			
      上記のプログラムは,組み込み関数 gets を利用して,標準入力から 1 行ずつ読み込み,それを標準出力へ出力しているだけです.チェックボックスにおいて「キャベツ」と「ジャガイモ」,また,リストにおいて「蜜柑」と「葡萄」を選択すると(以下の説明においても,常に,これらを選択するものとします).以下に示すような出力が得られます.

    name=菅沼 義昇 
    sex=Male 
    v1=on 
    v3=on 
    list=蜜柑 
    list=葡萄 			
      しかし,送信フォームの MIME タイプを application/x-www-form-urlencoded に変更する( ENCTYPE 属性に対する指定を行わない)と,以下に示すような出力結果となり,コード変換などが必要になります.

    name=%90%9B%8F%C0+%8B%60%8F%B8&sex=Male&v1=on&v3=on&list=%96%A8%8A%B9&list=%95%92%93%B8			

  2. CGI クラスの利用

      一般的な方法に対する説明の項で述べたように,送信されてきたデータは,

    (NAME 属性で指定された)名前 = 値

    という形をしています.そのため,これらのデータを利用するためには,「名前」や「値」の部分を取り出す必要があります.簡単な処理で可能ですが,PHP のように,「名前」を指定することによって「値」を得る方法があれば,より便利です.Ruby においても,以下に示す test.cgi のように,CGI クラスを利用することによって,このことが可能になります.

    #!/usr/bin/ruby
    
    $KCODE = "UTF8"
    printf "Content-type: text/html\n\n"
    printf "<HTML>\n"
    printf "<HEAD>\n"
    printf "	<TITLE>CGIB の例</TITLE>\n"
    printf "	<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\"../../../master.css\">\n"
    printf "</HEAD>\n"
    printf "<BODY CLASS=\"white\">\n"
    
    require "cgi"
    cgi = CGI.new
    p cgi
    printf "<BR>\n"
    p cgi['name']
    printf "<BR>\n"
    i = 0
    while i < 5
    	print cgi['list'][i], " "
    	i += 1
    end
    printf "<BR>\n"
    p cgi.params
    printf "<BR>\n"
    
    printf "</BODY>\n"
    printf "</HTML>\n"
    			
      「フォームの例2」においては,CGI として test.cgi を利用し,また,ENCTYPE 属性に対する指定を行っていません.このページに対して,先に述べた場合と同じ選択を行い,送信すると,以下に示すような結果が得られます.

    #["菅沼 義昇"], "list"=>["蜜柑", "葡萄"], "v1"=>["on"], "sex"=>["Male"], "v3"=>["on"]}, @cookies={}, @output_hidden=nil> 
    "菅沼 義昇" 
    蜜柑 葡萄 nil nil nil 
    {"name"=>["菅沼 義昇"], "list"=>["蜜柑", "葡萄"], "v1"=>["on"], "sex"=>["Male"], "v3"=>["on"]}			
      test.cgi においては,組み込み関数 require によって,CGI に関する拡張ライブラリをロードし,CGI クラスnew メソッドによって,CGI クラスのインスタンス cgi を生成しています.cgi には,上に示した出力結果からも明らかなように,送信されてきたデータに関する情報がすべて含まれています.その結果,cgi['name'] や cgi['list'][i] のように,「名前」を指定して「値」を得る(配列の添え字を指定してその値を得る)ことが可能になります.また,CGI クラスのメソッド params を利用して,ハッシュに変換することも可能です.

      しかし,ENCTYPE 属性に text/plain を指定すると,以下に示す出力結果のように,正しく動作してくれません.

    #["菅沼 義昇\r\nsex=Male\r\nv1=on\r\nv3=on\r\nlist=蜜柑\r\nlist=葡萄\r\n"]}, @cookies={}, @output_hidden=nil> 
    "菅沼 義昇\r\nsex=Male\r\nv1=on\r\nv3=on\r\nlist=蜜柑\r\nlist=葡萄\r\n" 
    nil nil nil nil nil 
    {"name"=>["菅沼 義昇\r\nsex=Male\r\nv1=on\r\nv3=on\r\nlist=蜜柑\r\nlist=葡萄\r\n"]} 			

情報学部 菅沼ホーム 目次 索引