代码之家  ›  专栏  ›  技术社区  ›  Peter

在Rails控制器线程中访问“session”

  •  0
  • Peter  · 技术社区  · 15 年前

    如何从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 回复  |  直到 15 年前
        1
  •  0
  •   Dave Sims    15 年前

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

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

    或者类似的。我仍然不相信会话是按值进行的,而不是按线程中的引用进行的。为了检查这一点,我刚刚在控制台上向新线程传递了一些散列,并且在该线程外可以看到对线程内散列所做的更改。是否有一些魔法使会话的行为有所不同?

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

        2
  •  1
  •   jonnii    15 年前

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

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