这个想法是:
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
任何意见都赞赏。
答案 0 :(得分:0)
选中Rails代码,如果我理解正确,会话实际上来自请求:
# actionpack-3.2.11/lib/action_controller/metal.rb:132
delegate :session, :to => "@_request"
似乎会话仅在请求周期上下文中有效,虽然可以访问,但是不会保存更改,如项目所示。
因此,这不起作用。正如@ Ruby on Rails Google Group和Ruby Rogues建议的那样,解决这个问题的最佳方法是使用Sidekiq,DelayedJob,Resque或类似的框架。
编辑:Access `session` within rails controller thread实际上是原因(示例中的后台处理是在一个单独的线程中完成的。)