gpt4 book ai didi

ruby-on-rails - 为什么我的线程变量在 Rails 中是断断续续的?

转载 作者:太空宇宙 更新时间:2023-11-03 17:27:19 25 4
gpt4 key购买 nike

我的应用程序 Controller 中有以下内容:

before_filter :set_current_subdomain

protected
def set_current_subdomain
Thread.current[:current_subdomain] = current_subdomain
@account = Account.find_by_subdomain(current_subdomain)
end

def current_subdomain
request.subdomain
end

然后是我的一些模型中的以下内容:

default_scope :conditions => { :account_id => (Thread.current[:account].id unless Thread.current[:account].nil?) }  

现在,这在某些时候有效。例如,我加载了一个索引方法并取回了一个应用了范围的记录列表,但有时也会得到一个空列表,因为 Thread.current[:account_id] 输出为 nil,即使请求中较早的查询正在运行使用相同的值。

问题是,为什么这不起作用,有没有更好的方法来设置一个对当前请求来说是全局的变量?

最佳答案

操纵 Thread 局部变量是一个非常糟糕的主意,只会导致悲伤、心痛和痛苦。无法保证请求处理的不同部分将由同一个线程处理,因此,您的变量可能最终会丢失。

Rails 约定是在 ApplicationController 的上下文中创建实例变量。简单来说,您真正要做的就是:

class ApplicationController < ActionController::Base
before_filter :set_current_subdomain

attr_reader :current_subdomain
helper_method :current_subdomain

protected
def set_current_subdomain
@current_subdomain = request.subdomain

@account = Account.find_by_subdomain(@current_subdomain)
end
end

您创建的任何 @... 类型变量都将附加到与当前请求关联的 ApplicationController 实例。请务必注意,每个请求都会发出相应 Controller 类的全新实例。

您可以自由创建任何您想要的实例变量,只要它们不会以某种方式与 Rails 本身使用的实例变量发生冲突,但一般而言,这种情况不会经常发生,冲突通常发生在方法名称上。

类级实例变量将在启用“缓存类”标志的环境中的请求之间持续存在。在开发环境中,每次发出请求时都会重新加载 Controller 类,以确保它反射(reflect)源文件的当前状态。

关于ruby-on-rails - 为什么我的线程变量在 Rails 中是断断续续的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4217911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com