Grape on Rails and Session

fukayatsu Advent Calendar 2013 - 2日目

intridea/grapeでAPIをRailsにmountして使っていて、両方のCookieSessionを共有したかった。
最終的に以下のようなhelper methodを用意することに落ち着いた。

# routes.rb
FooBar::Application.routes.draw do
  mount API => "/api"
end
# api.rb
class API < Grape::API
  format :json

  helpers do
    def session
      env[Rack::Session::Abstract::ENV_SESSION_KEY]
    end
  end

  mount API::V1
end

余談

Session is responsible for lazily loading the session from store.

にあるようにsessionの情報はSession#[]Session#[]=の初回呼び出し時にloadされ、
その前にSession#inspectが呼ばれると#<Session [id] not yet loaded>が返ってくる。