我是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上,它可能无法保证一个请求始终由单个线程服务。
当在Map的控制器的方法内处理请求时,示例化需要访问此request_context的类的新对象。
class CreditCardPaymentsController < ApplicationController
def new
@paypage_id=PaypageIdRequest.new(:merchant_id => merchant_id)
end
end
在PaypageIdRequest类的方法中,我需要访问我在request_context中设置的correlation_id。请注意,我不能在初始化时将变量发送到PaypageIdRequest类,因为有太多的地方我必须发送此变量,考虑到面向方面的编程,在所有地方都发送此变量将是一种糟糕的做法。
2条答案
按热度按时间vmjh9lq91#
在Rails(以及一般的Rack应用程序)中,您有
env
,它是一个类似哈希的对象,包含request object。中间件(如Warden)使用env
将它们自己注入到您的应用程序中。然而这不是一个全局的。它在路由、控制器和视图中可用,但在不支持请求的模型中不可用,也不能在您添加到MVC模型中的任何其他对象(如服务对象或装饰器)上使用,除非您传递它。
如果你想让它在你的
PaypageIdRequest
类中可用,你需要使用构造函数或方法注入,或者使你保存的任何东西都是全局的。wrrgggsh2#
是的,Rails通过它的CurrentAttributes API提供了这个功能。
https://api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html