2

我正在使用 Rack:Session:Pool 进行基于内存的会话。我想访问在 Rack:Session:Pool 中联系的池实例变量,以便我可以看到所有活动会话和包含的数据。我怎样才能在 Sinatra 中或在 irb 提示符下做到这一点。

我最初的想法是::Sinatra:Application::Rack::Session:Pool,但这似乎给了我类而不是当前实例,因此无法访问池变量。

4

1 回答 1

3

如果你这样做只是为了开发/调试/用棍子戳代码,你可以做一些猴子补丁并使池成为全局变量。

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 
#...

对于调试,猴子补丁可能更干净,因为您不必更改use调用,并且您可以用检查环境的东西包装猴子补丁,因此它仅在开发等期间使用。

于 2009-12-14T22:53:49.827 回答