首页 > 解决方案 > 如何在不同的上下文中传递变量

问题描述

代码如下:

http_adapter = ::GraphQL::Client::HTTP.new(schema_url) do
  def headers(context)
    {
      'Authorization': "Bearer #{}",
      'Content-Type': 'application/json'
    }
  end
end

我需要的是从http_adapter级别上下文传递一个变量到内部Bearer #{}。此外,由于令牌每隔几个小时过期一次,因此我无法传递常量或环境变量。那么如何正确传递令牌?谢谢。

顺便说一下,上面的代码是实例方法的一部分。

标签: ruby-on-railsrubygraphql

解决方案


可以Module#define_method用来保留范围:

http_adapter = ::GraphQL::Client::HTTP.new(schema_url) do
  define_method :headers do |context|
    {
      'Authorization': "Bearer #{}", # outer context is available here
      'Content-Type': 'application/json'
    }
  end
end

或者,可以在以下位置使用专用实例变量::GraphQL::Client::HTTP

::GraphQL::Client::HTTP.instance_variable_set(:@bearer, ...)
http_adapter = ::GraphQL::Client::HTTP.new(schema_url) do
  def headers(context)
    {
      'Authorization': "Bearer #{self.class.instance_variable_get(:@bearer)}",
      'Content-Type': 'application/json'
    }
  end
end

或者,也可以自己执行初始化

http_adapter = ::GraphQL::Client::HTTP.new(schema_url)
http_adapter.class.send(:attr_writer, :bearer)
http_adapter.bearer = ...
http_adapter.extend(Module.new do
  def headers(context)
    {
      'Authorization': "Bearer #{@bearer}",
      'Content-Type': 'application/json'
    }
  end
end)

推荐阅读