Скручивание результатов в Ruby on Rails - PullRequest
0 голосов
/ 13 мая 2019

У меня есть следующая функция в 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

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

1 Ответ

0 голосов
/ 13 мая 2019

Если у вас есть метод 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 для преобразования двух путей в два результата.

...