【问题标题】:Share session between a Rails2 and Rails3 app在 Rails2 和 Rails3 应用程序之间共享会话
【发布时间】:2011-09-09 09:12:54
【问题描述】:

我想使用会话 cookie 存储在 Rails 2.3.14 应用和 Rails 3.0.10 应用之间共享会话。

我找到了一篇很棒的博文,它解释了如何设置它: http://blog.kabisa.nl/2010/10/27/share-sessions-between-rails-2-and-rails-3-applications/

在出现问题之前一切正常,Rails2 将会话键存储为符号,Rails3 存储为字符串。还提供了一个补丁来解决这个问题:

# lib/patches/cgi/session.rb
require 'cgi/session'

class CGI #:nodoc:
  class Session #:nodoc:
    def [](key)
      @data ||= @dbman.restore
      @data[key.to_s]
    end

    def []=(key, val)
      @write_lock ||= true
      @data ||= @dbman.restore
      @data[key.to_s] = val
    end
  end
end

该博客是 2010 年的,看起来这个补丁对 Rails2.3.14 应用程序的工作时间更长。我还读到 CGI 真的被弃用了,所以我想知道这个补丁是否仍然是解决问题的正确方法。

有什么建议可以确保 Rails2 和 Rails3 对会话密钥使用相同的数据类型?

【问题讨论】:

  • 使用 Rails 2 或 Rails 3 应该没有区别,因为 cookie 在浏览器中存储为字符串(文本文件)。使用符号或字符串来获取/设置值都没有关系。序列化可能已从 2 更改为 3。您不能尽可能使用原始方法吗?

标签: ruby-on-rails-3 ruby-on-rails-2


【解决方案1】:
module ActionController
  module Session
    class AbstractStore
      class SessionHash < Hash
        def [](key)
          load_for_read!
          super(key.to_s)
        end

        def []=(key, val)
          load_for_write!
          super(key.to_s, val)
        end
      end
    end
  end
end

或者如果您更喜欢修改 2.3.8,您可以将其添加到 config/initializers/session_store.rb

module ActionController::Session
  class AbstractStore
    class SessionHash < Hash
       def [](key)
         load! unless @loaded
         super(key.to_s)
       end

       def []=(key, value)
         load! unless @loaded
         super(key.to_s, value)
       end
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2021-06-26
    • 2011-02-02
    • 2018-08-29
    相关资源
    最近更新 更多