#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.