2009-12-14 55 views
1

我使用機架:會話:池基於內存的會話。我想 訪問在 機架接觸池實例變量:會話:水池,所以我可以看到所有的活動會話和包含的數據。我如何從Sinatra或irb提示符中執行 。西納特拉+機架式:會話:游泳池

我最初的想法是:Sinatra:Application :: Rack :: Session:Pool,但是 似乎給我這個類而不是當前實例,所以 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 

或者,您可以編寫一個包裝器,爲您做到這一點。

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通話可能更清潔,你可以用的東西,檢查環境,所以它是devel的過程中只用,等,等包住猴補丁。

+0

這似乎並不奏效。全局變量在sinatra應用程序的範圍內是'nil'。而且,我相信全局變量是上面的例子中被按值傳遞不引用所以當會話存儲在他們不會在它是按值傳遞的$池 – Peter 2009-12-15 04:30:19

+0

反映@pool,但價值是一個指向相同的哈希對象。除非沒有分配,否則它不應該是'nil'。 – BaroqueBobcat 2009-12-15 16:58:43

+0

好吧,我再次測試了「猴子補丁」版本,它工作!我認爲問題在於調用「y $ pool」返回併爲空字符串。我只叫「$ pool.to_yaml」,它的工作。 – Peter 2009-12-15 19:17:11