ChromeでSinatraのCookieを正しく動作させる

SinatraCookieを(とりあえず)使う

まずはsinatra-contribというgemが必要。

Gemfileに

gem 'sinatra-contrib'

と書いてbundle installするか、

gem install sinatra-contrib

でインストール。

そうすると

require 'sinatra/cookies'

Cookieが利用できるようになる。
Cookie自体の使い方は至って簡単で、

get '/test' do
    cookies[:test] = 'hogehoge'
    "cookies[:test] = #{cookies[:test]}"
end

のようにcookiesというハッシュオブジェクトを通して利用することができる。

はずだったのだが…

ChromeCookieが保存されない

ChromeだけでなくFirefoxでも同様の現象が確認できた。普段はSafariを使っているので盲点だった。

Session Cookieではなく永続Cookieを使う

「え?Cookieって永続するんじゃないの?」
と思うところなのだが、実はSinatraはデフォルトの状態ではSessionベースのCookieを使っているらしい。
Sessionベースというか、ようするにSessionだ。
つまり、ブラウザを閉じればCookieが飛んでしまう。
あまり詳しい理由はわからないが、Session CookieだとChromeではCookieが保存されなかった。理由を知ってるえらいひとがいたら是非教えてください!

ともかく、一般的な永続Cookieを利用することで、ChromeでもCookieが保存されるようになった。めでたしめでたし。

get '/test' do
    request.set_cookie :test,
        {:value => 'hogehoge', :max_age => "#{3600*24*7}"}
    "cookies[:test] = #{cookies[:test]}"
end

【参考】Using Persistent Cookies in Sinatra