Как получить доступ к переменной экземпляра внутри блока

Я работаю с гемом graphql-клиент и хочу сделать его динамическим для разных URL и токенов.

Пример, приведенный в документации по драгоценным камням и в других местах, имеет жестко закодированный URL-адрес и токен.

Я пытаюсь получить доступ к @shop.token внутри блока def headersGraphQL::Client::HTTP

class Graphql

  def initialize(shop_id)
    @shop = Shop.find_by(shop_id)
  end

  def http
    GraphQL::Client::HTTP.new("http://graphql-swapi.parseapp.com/") do
      def headers(context)
        { 
          "User-Agent": "My Client",
          "Token" : @shop.token
        }
      end
    end
  end

  def client
      schema = GraphQL::Client.load_schema(http{@shop})
      
      @client ||= GraphQL::Client.new(schema: schema, execute: http{@shop}).tap do |client|
        client.allow_dynamic_queries = true
      end
  end

end

Rails может предоставлять доступ к переменным экземпляра внутри блока с помощью yield или self.instance_eval(&block) Но можем ли мы получить доступ к @магазин внутри метода заголовков, чтобы сделать токен динамическим.

Определен http-класс graphql-client здесь

Как вы на самом деле используете клиента в коде? Такое чувство, что, может быть, вы могли бы передавать токен как часть контекста, то есть "Token" : context[:token]? Похоже на то, как user_id перенаправляется в контекст в README?

Tom Lord 30.03.2021 13:17

Вы можете попробовать использовать lambda { "User-Agent": "My Client", "Token" : lambda {@shop.token} }. Он не будет работать напрямую, вам придется использовать его с .call.

Fravadona 30.03.2021 13:19

@TomLord Я обновил код для клиента, не могли бы вы взглянуть

Akash Kinwad 30.03.2021 13:29

Хорошо, а как составить запрос? Опять же, просто глядя на этот README, context передается каждому запросу. Так будет ли целесообразно передавать token: @shop.token вместе с каждым запросом? Вы, например, определили метод Graphql#query?

Tom Lord 30.03.2021 13:48

@TomLord Спасибо, попробую передать его через контекст при вызове метода запроса

Akash Kinwad 30.03.2021 14:10

«Не используйте определения вложенных методов, вместо этого используйте лямбда. Определения вложенных методов фактически создают методы в той же области (например, в классе), что и внешний метод. Более того,« вложенный метод »будет переопределяться каждый раз, когда вызывается метод, содержащий его определение. . " github.com/rubocop/ruby-style-guide#no-nested-methods

max 31.03.2021 00:19

@max да, за исключением того, что здесь выполняется оценка экземпляра. Щелкните ссылку вверху вопроса OP.

Tom Lord 31.03.2021 01:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
65
0

Другие вопросы по теме