Curl смешивает результаты в Ruby on Rails

У меня есть следующая функция в payment.rb

def self.create_customer_with_card arg
  customer_list = Curl.get("#{BaseURL}/customer") do |curl|
    curl.headers["Authorization"] = authorization_header
    curl.headers['Content-Type'] = 'application/json'
  end

  customer = Curl.get("#{BaseURL}/customer/660391") do |curl|
    curl.headers["Authorization"] = authorization_header
    curl.headers['Content-Type'] = 'application/json'
  end
  byebug
end

Я поместил byebug в конец функции. когда независимо от того, проверяю ли я customer_list или customer, это дает мне результат клиента. в то время как если я попробую их по отдельности, результаты будут в порядке. Но сохранение обоих в одной и той же функции присваивает выход второй функции обеим переменным. Я использую gem 'curb', '~> 0.9.4' для завитка. Есть идеи?


person ImranNaqvi    schedule 13.05.2019    source источник


Ответы (1)


Когда у вас есть метод Ruby в форме:

def x
  a = ...
  b = ...
end

Возвращаемым значением этого метода всегда является значение, присвоенное локальной переменной b, а любое значение, присвоенное локальной переменной a, отбрасывается. Помните, что локальные переменные существуют только в пределах области действия вашего блока, если только не задействованы замыкания. За пределами этой области любые содержащиеся в них значения отбрасываются, если не сохраняются иным образом.

Если вы хотите вернуть оба значения, просто сделайте следующее:

def self.create_customer_with_card arg
  [
    Curl.get("#{BaseURL}/customer") do |curl|
      curl.headers["Authorization"] = authorization_header
      curl.headers['Content-Type'] = 'application/json'
    end,
    Curl.get("#{BaseURL}/customer/660391") do |curl|
      curl.headers["Authorization"] = authorization_header
      curl.headers['Content-Type'] = 'application/json'
    end
  ]
end

Затем вы называете это так:

customer_list, customer = create_customer_with_card(arg)

Хотя arg не используется, так что пока его не надо удалять.

Как только в этой форме становится довольно очевидно, более минимальная форма:

def self.create_customer_with_card
  [ "/customer", "/customer/660391" ].map do |path|
    Curl.get("#{BaseURL}#{path}") do |curl|
      curl.headers["Authorization"] = authorization_header
      curl.headers['Content-Type'] = 'application/json'
    end
  ]
end

Где это использует map для преобразования двух путей в два результата.

person tadman    schedule 13.05.2019