読者です 読者をやめる 読者になる 読者になる

私が歌川です

@utgwkk が書いている

RubyでCookieを扱う(CGI::Cookieは使いづらいねって話)

技術

RubyCookieを扱いたくてググってたが、いかんせんCGI::Cookieは使いづらい。
初心者には敷居が高い、というかどうやって動かすんだこれ……

で、やっぱり、Cookieをセットするには、HTTPヘッダーに、

Set-cookie: rumia=love; expires=Sun, 14-Jul-2013 20:00:00 GMT;  # 値と有効期限ね

みたいに書いてやるのがよさそうだ。

Cookieを取得するときは、

ENV['HTTP_COOKIE'] # rumia=love

を参照してやればいい。
複数Cookieがセットされている場合は、

rumia=love; utagawa=kiki

みたいになっているから、

ENV['HTTP_COOKIE'].split(/;\s/)

としてやれば、key=valueの形に分割できる。
あとはそれをさらにsplit(/=/)してやれば、Cookieの値が取得できるね。そこは割愛してます。

ところで、CGI::Cookiesの何が使いづらいって、

  • マニュアルが充実していない(?)
  • cgi.out("cookie" => cookies) do なる謎の構文を使わねばならない
  • エラーしか出てこなかった

ってとこですね。
つまり、Cookieの扱いはPerlと何ら変わらないわけだ(もしかするとそっちが正しいだけかも)

サンプルコード。Cookieを取得してcookie['key']といったハッシュにしてやる。

cookie = Hash.new
ENV['HTTP_COOKIE'].split(/;\s/).each do |bo|
  mo = bo.split(/=/)
  cookie[mo[0]] = mo[1]
end

こんな感じにしてやればいい。