2009-06-24 113 views
5

我正在开发一个rails 2.3.2应用程序。 我需要为订单记录保留session_id,检索它并最终在订单完成时删除session_id。 它工作时,我用cookies作为会话存储,但它不适用于active_record存储。 (我重新启动了浏览器,因此没有缓存问题。)Rails 2.3会话

我知道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

什么“不工作” - 而且,更重要的是,你尝试过什么?您是否确认session_id正在分配给数据库行,并且它正在Cookie中维护? – Matchu 2009-06-24 00:37:10

回答

9

我遇到了编程购物车相同的问题。实际上有两个问题。 从rails 2.3开始,会话被延迟加载,session [: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

格雷格

+0

感谢您对session.session_id的弃用警告! – Dr1Ku 2010-03-06 12:22:44

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