我正在开发rails 2.3.2 app。 我需要为订单记录保留session_id,检索它,最后在订单完成时删除session_id。 当我使用cookie作为会话存储但它不适用于active_record存储时,它工作。 (我重新启动了浏览器,因此没有缓存问题。)
我知道rails 2.3实现了延迟会话加载。 我读了一些关于它的信息,但我仍感到困惑。
有人可以澄清我如何在这种情况下使用session_id吗?
我在做什么......
A user make an order going through several pages. There is no sign-up, neither login. So I keep session_id in the order record so that no other user can access the order. @order = Order.last :conditions => {:id => params[:id], :session_id => session[:session_id] } When the order is finished, I set nil to session_id column.
您如何在延迟会话(和active_record存储)环境中实现这种情况?
感谢。
萨姆
答案 0 :(得分:9)
我遇到了编程购物车的同样问题。实际上有两个问题。 从rails 2.3开始,会话延迟加载,会话[:session_id]不再有效。您必须先访问会话才能使用它。
puts request.session_options[:id]
session[:session_id] # this forces load of the session in Rails 2.3.x
puts request.session_options[:id]
输出:
nil
78eb1e371f3378ed98874f9ce372d652
更新:不推荐使用session.session_id,因此请改用request.session_options [:id]。
更新2 :这将在3.x(不是2.3.5)https://rails.lighthouseapp.com/projects/8994/tickets/2268-rails-23-session_optionsid-problem
中修复格雷格
答案 1 :(得分:3)
我更喜欢使用此方法来记录会话ID(但Rails 2.2也会在日志文件中存储会话ID而不做任何修改)
application_controller.rb
before_filter :log_session_id
private
def log_session_id
session[:session_id]
logger.info "Session ID: " + request.session_options[:id]
end
end
答案 2 :(得分:0)
我可以将该补丁用于2.3.5
http://github.com/rails/rails/commit/e0f1a7dc191ffebc9f6cadb6232e567fee8aa491
不要将Hash继承添加到CookieStore