在会话中存储Rails控制器回调数据

时间:2013-05-27 09:25:02

标签: ruby-on-rails-3 session callback

这个想法是:

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

Async Callback

Controller在回调中接收结果:

# 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

任何意见都赞赏。

1 个答案:

答案 0 :(得分: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或类似的框架。

编辑:Access `session` within rails controller thread实际上是原因(示例中的后台处理是在一个单独的线程中完成的。)