【问题标题】:How to conditionally assign ActionController::Base.session in rails 2.3.3如何在 rails 2.3.3 中有条件地分配 ActionController::Base.session
【发布时间】:2011-06-06 19:19:05
【问题描述】:

我有一个 Rails 应用,在 config/initializers/session_store.rb 文件中有以下内容:

ActionController::Base.session = {
  :key         => '_app_session',
  :secret      => 'a really long string here',
  :expire_after => 2.minutes
}

ActionController::Base.session_store = :active_record_store

因此,在正常操作期间,我们会看到在数据库中为每个会话创建 ActiveRecord 对象。问题是我们并不总是希望为请求创建会话 - 我们希望能够关闭自动请求的会话创建。我们在数据库中看到了数千条会话记录,每个自动请求都有一条。在 Rails 2.3.3 之前,以下是可能的:

class ApplicationController < ActionController::Base
  session :off
  ...
end

但现在在 Rails 2.3.3 中,“session :off”已被弃用,因为会话现在是延迟加载的——如果你不使用它们,它们就不会被创建。问题似乎是会话对象总是在 sessionstore.rb 文件中分配,因此总是被创建。如果我从配置文件中删除会话分配块,那么在自动请求之后不会出现会话记录。我的问题是,如何将配置分配移到 session_store.rb 之外的会话散列并移到 ApplicationController 类(或其他地方)中,只有在请求不是自动化的情况下才能有条件地分配会话?我担心在执行控制器处理程序之前可能需要会话配置数据。我会将会话键值的分配放在哪里?

提前感谢您的帮助。

【问题讨论】:

  • 出于兴趣,您是否有理由不使用默认的基于 cookie 的会话实现?

标签: ruby-on-rails session lazy-loading


【解决方案1】:

config/initializers 是一次性配置,它们通常只在启动时运行一次。根据文档,延迟加载只会在请求期间触摸“会话”对象时才初始化会话

您确定在请求周期中根本不接触会话变量吗? (即在过滤器、操作、助手或模板中)。另外,会话对象是否有一些内容可以提示您创建它们的位置?

【讨论】:

    【解决方案2】:

    很抱歉“迟到”的答案,但我认为这与登陆这里的人有关。 自从 session :off 从 Rails 中删除以来,一直在为类似的问题而苦苦挣扎。

    我决定将它“反向移植”到 Rails 2.3+ 作为插件 https://github.com/kares/session_off

    【讨论】:

    • 我用 Devise 尝试了你的“反向端口”,但它不起作用。知道为什么吗?
    • 很可能是因为现在大多数 Rails 插件都假定 controller.session 永远不会是 nil,因此如果你有使用 session 的外部代码,你可能无法使用 session_off 没有额外的“调整”......对不起
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多