Я работаю с гемом 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 здесь
Вы можете попробовать использовать lambda { "User-Agent": "My Client", "Token" : lambda {@shop.token} }. Он не будет работать напрямую, вам придется использовать его с .call.
@TomLord Я обновил код для клиента, не могли бы вы взглянуть
Хорошо, а как составить запрос? Опять же, просто глядя на этот README, context передается каждому запросу. Так будет ли целесообразно передавать token: @shop.token вместе с каждым запросом? Вы, например, определили метод Graphql#query?
@TomLord Спасибо, попробую передать его через контекст при вызове метода запроса
«Не используйте определения вложенных методов, вместо этого используйте лямбда. Определения вложенных методов фактически создают методы в той же области (например, в классе), что и внешний метод. Более того,« вложенный метод »будет переопределяться каждый раз, когда вызывается метод, содержащий его определение. . " github.com/rubocop/ruby-style-guide#no-nested-methods
@max да, за исключением того, что здесь выполняется оценка экземпляра. Щелкните ссылку вверху вопроса OP.





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