Могу ли я сделать эту «блочную обертку» необязательной идиоматичной / аккуратной? - PullRequest
0 голосов
/ 15 октября 2019

В ruby, вы можете вызвать удаленный API, как это

def get_remote_date
  Net::HTTP.get('example.com', '/index.json')
end

Если вы делаете gem install vcr, вы можете сделать это

def get_remote_date
  VCR.use_cassette("cassette_001") do
    Net::HTTP.get('example.com', '/index.json')
  end
end

VCR запись / воспроизведение помогает во время разработки, когда удаленный API стоит дорого. Использовать или нет vcr необязательно, указывается первым аргументом функции:

def get_remote_date(should_use_vcr)
  VCR.use_cassette("cassette_001") do
    Net::HTTP.get('example.com', '/index.json')
  end
end

Мой вопрос: как мне переписать метод так, чтобы "block wrapping" / "VCR.use_cassette("cassette_001") do "зависит от логического значения локальной переменной should_use_vcr.

Я мог бы сделать

def get_remote_date(should_use_vcr)
  if conditional here
    VCR.use_cassette("cassette_001") do
      Net::HTTP.get('example.com', '/index.json')
    end
  else
    Net::HTTP.get('example.com', '/index.json')     
  end
end

, но для сложного метода, который имеет" Net :: HTTP. get ("плюс еще десяток строк, слишком много дублирования кода, поэтому ищите более удобный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 16 октября 2019

Вы можете попробовать использовать следующий подход:

def get_remote_date
  record_request { Net::HTTP.get('example.com', '/index.json') }
end

def record_request(&request)
  ENV['RECORD_REQUEST'] ? VCR.use_cassette("cassette_001", &request) : request.call
end

Это хорошая статья , в которой объясняется, что означает &block (параметр амперсанда) и как он связан сyield ключевое слово.

0 голосов
/ 16 октября 2019

Иллюстрирующий решение на основе доходности,

  def maybe_cache_http_requests(cassette)
    if ENV['CACHE_HTTP_REQUESTS'] == "1"
      require 'vcr'
      VCR.configure do |config|
        config.cassette_library_dir = "vcr_cassettes"
        config.hook_into :webmock
      end
      VCR.use_cassette(cassette) do
        yield
      end
    else
      yield
    end
  end
0 голосов
/ 15 октября 2019

Вы можете поместить повторяющийся код в метод и вызвать этот метод, либо обернутый в блок do видеомагнитофона, либо без видеомагнитофона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...