2012-05-31 62 views
4

我有一個簡單的Sinatra應用程序,我想在所有會話和請求中共享一個變量。Sinatra全球應用變量

configure do 
    @@click_count = 0 
end 

def send_message(text) 
    # ignore, this part works 
end 

post '/click' do 
    @@click_count = @@click_count + 1 
    send_message "clicks: #{@@click_count}" 
end 

發送的消息總是clicks: 1代替遞增。我也試過set :click_count, 0然後settings.click_count = settings.click_count + 1但我仍然得到同樣的東西。

我在本地用霰彈槍使用shotgun web.rb -p 4567 -E production運行服務器,因爲在非生產環境中提到的另一個問題是服務器在每次失去狀態的請求上重新啓動。

任何想法如何讓這個工作?

+0

是的,我知道這是一個壞主意。這是一個學習練習,而不是生產應用程序。 –

回答

5

西納特拉本身不會重新啓動在開發模式(it used to)每個請求,但shotgun有效果:

每個接收請求,它叉時,加載在 孩子過程中的應用,處理請求並退出子進程。

只需使用ruby web.rb,一切都應該工作(模仿線程問題,你評論它看起來像你所知道的)。

+0

ruby​​ web.rb工作。有沒有辦法做到這一點,但仍然使用霰彈槍?如果沒有,它在本地和Heroku上都很酷,但我希望能夠使用霰彈槍在本地進行測試。 –

+0

我猜你已經考慮過一個關鍵值存儲作爲一個可能的選項:) – Kashyap

+1

@JohnSheehan因爲霰彈槍在每個請求上產生一個新的進程,變量每次都會重新初始化。您必須以某種方式將其存儲在流程外部,也許在某種數據庫中。你可以簡單地使用一個文件,但在只讀文件系統上Heroku會很困難。 – matt

2

我不確定configure塊的運行頻率。嘗試使用全局變量(例如$click_count)而不是類實例變量,並將其初始化爲程序的最頂部,而不是任何塊。