Как передать переменные в разных контекстах - PullRequest
0 голосов
/ 06 сентября 2018

Код похож на:

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

Мне нужно передать переменную из контекста уровня http_adapter во внутренний Bearer #{}. Также я не могу передать константу или переменную окружения, поскольку токен истекает каждые несколько часов. Так как мне правильно передать токен? Спасибо.

Кстати, приведенный выше код является частью метода экземпляра.

1 Ответ

0 голосов
/ 06 сентября 2018

Можно использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...