Что делает этот код ruby on rails?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я работаю над проектом, и произошла ошибка, когда клиент получил ответы. Когда они вызвали вызов API, они получили ошибку 500. Из журналов я определил код, вызывающий ошибку, которая показана ниже:

 def send
  adapter = @config['type']
  response = "Adapters::#{adapter}".constantize.new(@config, @msisdn, @message).send
  response ? (%w(200 201 202).include? response.code.to_s) : false
end
 

Ошибка вызвана строкой:

 response ? (%w(200 201 202).include? response.code.to_s) : false
 

Мое понимание этой строки ограничено, поэтому я мог бы помочь лучше понять ее. Я полагаю, что он проверяет, содержит ли ответ один из кодов 200, 201 или 202, но не уверен. Любая помощь приветствуется.

Комментарии:

1. В чем ошибка?

2. 2016-10-04 10:08:44 0000: Ошибка приложения Rack: #<Ошибка NoMethodError: неопределенный метод `code’ для false:FalseClass>

3. Строка перед этим. Похоже, вы не предоставили его полностью.

Ответ №1:

В основном это означает следующее:

 if(response)
  if(['200', '201', '202'].include?(reponse.code.to_s))
    return true
  else
    return false
  end
else
  return false
end
 

Ответ №2:

Ошибка, по-видимому, заключается в том, что метод adapters #send возвращает true / false вместо какого-то объекта ответа, который ожидается.

Вы можете найти источник возникновения ошибки с помощью:

 adapter = "Adapters::#{adapter}".constantize.new(@config, @msisdn, @message)
puts adapter.method(:send).source_location
 

Или вы можете исправить это условие:

 def send
  adapter = @config['type']
  response = "Adapters::#{adapter}".constantize.new(@config, @msisdn, @message).send
  response.try(:code).in?(200..202)
end
 

try вызывает метод «безопасно», проверяя, определен ли метод. .in? это что-то вроде перевернутого includes? на стероидах. Оба являются расширениями ядра ActiveSupport, предоставляемыми rails.