2009-12-14 4 views
1

Я использую Rack: Session: Pool для сеансов на основе памяти. Я хотел бы получить доступ к переменным экземпляра пула, с которым связался в Rack: Session: Pool, чтобы я мог видеть все активные сеансы и содержащиеся данные. Как я могу сделать , что из Sinatra или в строке irb.Sinatra + Rack: Session: Pool

Моя первоначальная мысль была: Sinatra: Application :: Rack :: Session: Pool, но , который, кажется, дает мне класс, а не текущий экземпляр, поэтому переменная пула недоступна.

ответ

2

Если вы делаете это только для разработки/отладки/выкидывания кода с помощью палки, вы можете выполнить некоторые попытки обезьяны и сделать пул глобальной переменной.

require 'rubygems' 
require 'sinatra' 
require 'yaml' 

class Rack::Session::Pool 
    def initialize app,options={} 
    super 
    [email protected]=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 
#... 

Для отладки, обезьяна патч, вероятно, чище, так как вам не придется менять use вызов, и вы можете обернуть monkeypatch с тем, что проверяет окружающую среду, так оно используется только во время разви, и т.д., и т.д. ,

+0

Это, похоже, не работает. Глобальная переменная «nil» находится в пределах приложения синатра. Кроме того, я считаю, что глобальная переменная - это пример, который передается значением not reference, поэтому, когда сеанс a, сохраненный в @pool, они не будут отображаться в пуле $ – Peter

+0

, он передается по значению, но это значение является указателем на тот же хэш-объект. Это не должно быть «ноль», если оно не было назначено. – BaroqueBobcat

+0

Ну, я снова тестировал версию «обезьянника», и это сработало !. Я считаю, что проблема заключалась в том, что возвращался вызов «y $ pool» и пустая строка. Я просто назвал «$ pool.to_yaml», и он сработал. – Peter

Смежные вопросы