【问题标题】:How to persist the session in Rails before the end of request?如何在请求结束之前在 Rails 中保持会话?
【发布时间】:2011-12-02 23:07:41
【问题描述】:

我使用 Rails 2.3 和 ActiveRecord 作为会话存储,我想避免在需要之前创建会话。

我有一个 Itens 表来存储与会话关联的项目,即它的模型有一个关联 belongs_to :session

我有一个应该创建一个新项目的 Ajax 调用。当还没有会话时,它应该创建一个与项目关联的会话。 为此,我需要会话表中的 id,而不是用于识别 cookie 会话的 session_id。 但是,会话记录仅在请求完成后才在数据库中创建。 例如:

def create
  request.session_options[:id] # nil if there is no session yet
  session[:activate] = 1 # this "creates" the sesssion (but not in DB)
  request.session_options[:id] # now the new generated session_id
  db_session = Session.find_by_session_id(request.session_options[:id]) # nil, not in DB yet :(
  Item.new(
    :session_id => db_session.id, # ops, id called for nil object
    :data => params[:data]
  )
end

【问题讨论】:

    标签: ruby-on-rails session activerecord session-store


    【解决方案1】:

    “模型对象不应该对会话一无所知”(Pat Maddox,来自http://markmail.org/message/4ilmpn7s3wkq6iod)。

    这是有道理的,因为如果我决定将会话存储在内存、cookie、文件系统或任何地方,模型代码中没有任何变化。

    因此,解决方案是创建另一个表来存储 items_groups。 如果还没有会话,则创建一个新的 items_group 并将其 id 存储在会话中。否则,从会话中检索 items_group_id,我们就完成了!

    会话何时存储在数据库中不再重要。

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多