在rails控制器线程中访问`session`

如何在rails中的线程内查看/更改会话数据? 在控制器中查看此代码段:

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

(与这个问题有关 ,但更具体。我希望答案完全不同。)

我仍然不确定为什么会话不会在一个线程内的引用范围内,但如果这是真的,你可以尝试将当前绑定作为参数传递给线程:

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

或类似的东西。 我仍然不相信会话是按值而不是通过线程中的引用。 为了检查这一点,我只是将一些哈希值传递给控制台上的新线程,并且在该线程外部可以看到对线程内的哈希所做的更改。 是否存在一些使会话表现不同的魔法?

编辑: DelayedJob不是一个更好的方法来处理从用户请求中分离出来的长时间运行的进程吗?

为什么需要在后台线程中更改会话数据?

您使用的是默认的cookie商店,因为如果您是我不确定这是如何工作的。 如果您要切换到memcached /数据库会话存储,您可能会有更多的运气,因为您可以在请求完成后访问会话。