我是Rails的新手,我想弄清楚Rails是否具有请求上下文,可以在其中存储变量并在请求的上下文中访问它们?我正在使用Rails 4.2.11。
我尝试在
中添加一个前置过滤器class ApplicationController < ActionController::Base
before_action :set_request_context
def set_request_context
Thread.current[:request_context] = {:correlation_id => "some_unique_id"}
end
end
然后我在代码中的其他地方访问此变量。我确信这不是正确的方法,因为该应用程序在ngnix上运行,并且可能无法保证整个请求都由单个线程处理。
在映射的控制器的方法中处理请求时,将实例化需要访问此request_context的类的新对象。
class CreditCardPaymentsController < ApplicationController
def new
@paypage_id=PaypageIdRequest.new(:merchant_id => merchant_id)
end
end
在PaypageIdRequest类的方法中,我需要访问在:request_context中设置的correlation_id。 请注意,在初始化时,我无法将变量发送到PaypageIdRequest类,因为我必须发送该变量的位置太多,考虑到面向方面的编程,在所有位置发送它都是一种不好的做法。
答案 0 :(得分:0)
在Rails(和一般的Rack应用程序)中,您有env
,它是一个类似哈希的对象,包含request object。 env
被Warden之类的中间件用来将自己注入到您的应用程序中。
但这不是全局的。它在路由,控制器和视图中可用,但在不请求感知的模型中不可用,除非您将其传递给MVC模型(例如服务对象或装饰器),否则它也不可用。
如果希望它在PaypageIdRequest
类中可用,则需要使用构造函数或方法注入,或进行任何保存全局的操作。