ruby-on-rails Rails是否提供请求上下文?

vdzxcuhz  于 2022-11-19  发布在  Ruby
关注(0)|答案(2)|浏览(171)

我是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类,因为有太多的地方我必须发送此变量,考虑到面向方面的编程,在所有地方都发送此变量将是一种糟糕的做法。

vmjh9lq9

vmjh9lq91#

在Rails(以及一般的Rack应用程序)中,您有env,它是一个类似哈希的对象,包含request object。中间件(如Warden)使用env将它们自己注入到您的应用程序中。
然而这不是一个全局的。它在路由、控制器和视图中可用,但在不支持请求的模型中不可用,也不能在您添加到MVC模型中的任何其他对象(如服务对象或装饰器)上使用,除非您传递它。
如果你想让它在你的PaypageIdRequest类中可用,你需要使用构造函数或方法注入,或者使你保存的任何东西都是全局的。

wrrgggsh

wrrgggsh2#

是的,Rails通过它的CurrentAttributes API提供了这个功能。
https://api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html

相关问题