2010-01-26 51 views
0

我怎麼看到鐵軌中的一個線程內/改變會話數據?看到這個代碼片段我的控制器內:訪問`session`軌控制線內

def controller_action 
    session[:something] = 'before' # works properly 
    Thread.new do 
    session[:something] = 'after' # out of scope. <--- how do I fix this? 
    end 
end 

(與this question,但更具體的我希望截然不同的答案。)

+1

我不會親自使用線程這樣的。如果你有一個長時間運行的進程,使用調度程序或隊列是最好的選擇。 – 2010-01-27 00:21:27

+0

@Toby:是的,同意了。如果你不需要,不要線索。 DelayedJob或類似的應該在這裏更好地工作。 – 2010-01-28 18:03:27

回答

0

我仍然不知道爲什麼會不會是在範圍上由一個線程內引用,但如果這是真的,你可以嘗試通過當前綁定到線程作爲參數:

Thread.new(binding) do 
    thread_session = eval("session", binding) 
end 

或類似的東西。我仍然不相信會話是按價值而不是在線程中引用的。要檢查這個我剛剛通過一些哈希到控制檯上的新主題,並以一個哈希做了一個線程中的變化是線程之外可見。有沒有讓會話表現不同的魔法?

編輯:會不會DelayedJob有更好的方式來處理來自用戶的請求分拆一個長期運行的進程?

1

爲什麼你需要更改在後臺線程會話數據?

您使用的是默認的cookie存儲,因爲如果你是我不知道如何做到這一點的工作。如果你切換到分佈式緩存/數據庫會話商店,你可能有更多的運氣作爲請求完成後,你可以訪問會話。