【问题标题】:Does Rails have a way to reset class variables between requests?Rails 有办法在请求之间重置类变量吗?
【发布时间】:2025-12-09 08:00:01
【问题描述】:

我意识到when thinking about the user, password, and site variables in ActiveResource::Base,它们可以在一个请求时修改,并且在下一个请求时保持修改。这似乎是不受欢迎的行为,并且可能是一个普遍的问题,因为它适用于类变量/属性的所有使用。

Rails 是否提供了一种机制来清除对类级别状态的更改(例如重置为默认值),以便每个请求都以原始状态开始?

如果没有,是否可以添加一种初始化类变量的方法,这些变量将在每个请求开始时重新应用?这可以与线程安全存储结合使用,从而减少类变量的问题。 class_attribute的可能修改?

更新:

正如我在the linked question above 中描述的那样,引起我注意的具体情况是,我正在为每个用户设置 ActiveResource::Base.user 和密码。如果我未能重置它们,这意味着代表一个用户的 REST 请求将在后续页面加载时使用另一个用户的凭据进行。

【问题讨论】:

    标签: ruby-on-rails initialization lifecycle class-variables


    【解决方案1】:

    出于好奇,您能否举一个具体的例子说明您为什么要这样做?从表面上看,这听起来像是您要求更改变量,所以 Rails 正在做您要求的事情。

    就答案而言,有几个选择:

    • 变量没有自动“切换回默认值”行为,没有。
    • 您可以在希望发生这种情况的每个控制器操作结束时手动重置值
    • 您可以编写一个执行此操作的模块(称为“acts_as_resettable”?),然后将该模块包含在您想要此功能的类中

    【讨论】:

    • 扩展 class_attribute 似乎是一个很好的方法,因为它已经提供了我想要的行为(可继承的类级属性)。它可以传递一个默认值,它将在每个请求时保存和重置,并且它可以使用 Thread.current 如@KandadaBoggu 在另一篇文章中建议的那样,以保证线程安全,如果这是一个问题。
    最近更新 更多