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或类似的框架
编辑:实际上是原因(示例中的后台处理在单独的线程中完成)