Синатра + Стойка: Сеанс:Бассейн
Вопрос
Я использую Rack: Session: Pool для сеансов на основе памяти.Я хотел бы получить доступ к переменным экземпляра пула, с которыми связываются в Rack: Session: Pool, чтобы я мог видеть весь активный сеанс и содержащиеся в нем данные.Как я могу сделать это из Sinatra или из командной строки irb.
моей первоначальной мыслью было ::Sinatra:Application::Rack::Session: Pool, но похоже, это дает мне класс, а не текущий экземпляр, поэтому переменная pool недоступна.
Решение
Если вы делаете это только для разработки / отладки / ковыряния в коде флешкой, вы могли бы выполнить некоторые обезьяньи исправления и сделать пул глобальной переменной.
require 'rubygems'
require 'sinatra'
require 'yaml'
class Rack::Session::Pool
def initialize app,options={}
super
$pool=@pool=Hash.new
@mutex=Mutex.new
end
end
use Rack::Session::Pool
get '/' do
y $pool
''
end
Или вы могли бы написать оболочку fn, которая сделает это за вас.
require 'rubygems'
require 'sinatra'
require 'yaml'
module PoolWrapper
def self.new *args
middleware = Rack::Session::Pool.new *args
$pool=middleware.pool
middleware
end
end
use PoolWrapper
# same as above
#...
Для отладки патч monkey, вероятно, более чистый, поскольку вам не нужно менять use
вызовите, и вы можете обернуть monkeypatch чем-то, что проверяет среду, чтобы она использовалась только во время разработки, и т.д. ит.п.