0

这个想法是:

  • 在后台执行一些耗时的操作。
  • 使用回调将该操作的结果传播回控制器。
  • 将结果存储在内存会话存储中。
  • 从那时起使用和使用会话中的结果。

异步回调

控制器在回调中接收结果:

# controller callback, saves result to session
# this method is executed as expected
# session id matches the one from other controller actions
def on_counter_value_calculated(context, new_value)
  @counter = new_value
  session[:counter] = @counter
end

但是,存储的会话会在后续调用中丢失:

# although the same session is targeted (same id)
# the saved value is not the same
def index
  @counter = session[:counter] || 0
end

我创建了一个小型 Rails 项目来演示该问题: https ://github.com/elvanja/controller_callbak_store_in_session

任何输入表示赞赏。

4

1 回答 1

0

检查 Rails 代码,如果我理解正确,会话实际上来自请求:

# actionpack-3.2.11/lib/action_controller/metal.rb:132
delegate :session, :to => "@_request" 

似乎会话仅在请求周期上下文中有效,尽管可以访问它,但不会保存更改,如项目所示。

因此,这将不起作用。正如@Ruby on Rails Google GroupRuby Rogues所建议的那样,处理这个问题的最佳方法是使用Sidekiq、DelayedJob、Resque 或类似框架。

编辑:在 rails 控制器线程中访问“会话”实际上是原因(示例中的后台处理是在单独的线程中完成的)。

于 2013-05-29T08:10:32.330 回答