Rails是否提供请求上下文?

时间:2019-05-18 14:39:15

标签: ruby-on-rails

我是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类,因为我必须发送该变量的位置太多,考虑到面向方面的编程,在所有位置发送它都是一种不好的做法。

1 个答案:

答案 0 :(得分:0)

在Rails(和一般的Rack应用程序)中,您有env,它是一个类似哈希的对象,包含request objectenv被Warden之类的中间件用来将自己注入到您的应用程序中。

但这不是全局的。它在路由,控制器和视图中可用,但在不请求感知的模型中不可用,除非您将其传递给MVC模型(例如服务对象或装饰器),否则它也不可用。

如果希望它在PaypageIdRequest类中可用,则需要使用构造函数或方法注入,或进行任何保存全局的操作。