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

时间:2010-01-26 13:37:54

标签: ruby-on-rails

如何在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

(与this question相关,但更具体。我希望答案完全不同。)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

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