Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 在会话中存储Rails控制器回调数据_Ruby On Rails 3_Session_Callback - Fatal编程技术网

Ruby on rails 3 在会话中存储Rails控制器回调数据

Ruby on rails 3 在会话中存储Rails控制器回调数据,ruby-on-rails-3,session,callback,Ruby On Rails 3,Session,Callback,这个想法是: 在后台执行一些耗时的操作 使用回调将该操作的结果传播回控制器 将结果存储在内存会话存储中 从那时起,使用并提供会话中的结果 控制器在回调中接收结果: # 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_

这个想法是:

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

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

# 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项目来演示这个问题:


欢迎任何输入。

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

# actionpack-3.2.11/lib/action_controller/metal.rb:132
delegate :session, :to => "@_request" 
会话似乎只在请求周期上下文中有效,尽管可以访问它,但更改不会保存,如项目所示

因此,这是行不通的。正如@and所建议的,处理这个问题的最佳方法是使用Sidekiq、DelayedJob、Resque或类似的框架

编辑:实际上是原因(示例中的后台处理在单独的线程中完成)