Как проверить и вернуть строку или вернуть false и выйти из оператора if - PullRequest
1 голос
/ 13 марта 2020

Работа в Rails 4.2 и Ruby 2.3.3

Я имею дело с API, который в определенных обстоятельствах имеет ошибку, но не в других. Я хотел бы проверить, существует ли этот ключ ошибки, и если да, свернуть его и найти что-то. Например, parsed - это га sh:

# parsed could be either:
# {error: "Email does not exist"}
# or 
# {result: ... }

return true  if parsed.dig('error').downcase!.include?('email does not exist') # refactor

. Я вижу, что dig возвращает ноль в этом случае. Есть ли способ, которым я могу сказать, что если заявление, чтобы выйти, если ноль? Может, принудительно установить значение false и выйти без добавления большого количества кода церемонии?

Я знаю, что могу сделать что-то подобное, но это кажется громоздким:

unless parsed['error'].nil?
  return true  if parsed.dig('error').downcase!.include?('email does not exist') # refactor
end

1 Ответ

1 голос
/ 13 марта 2020
parsed.dig('error').to_s.downcase.include?('email does not exist')

to_s преобразует nil в ''. Нет необходимости в downcase!, потому что вам не нужно мутировать исходный объект и потому что он возвращает nil, если не было внесено никаких изменений ; просто используйте downcase.

Обратите внимание, что ваш пример использует символизированные ключи, а ваш код использует строковые ключи, поэтому он никогда не будет совпадать:

parsed = {error: "Email does not exist"} # key is symbolized
parsed.dig('error').to_s.downcase.include?('email does not exist') # key is stringified
=> false

parsed = {error: "Email does not exist"} # key is symbolized
parsed.dig(:error).to_s.downcase.include?('email does not exist') # key is symbolized
=> true

Поскольку вы используете Rails, вы может сделать вашу жизнь немного легче с равнодушным доступом. Это позволяет получить доступ к ключам ha sh по строке или по символу:

parsed.with_indifferent_access.dig('error').to_s.downcase.include?('email does not exist')
=> true
parsed.with_indifferent_access.dig(:error).to_s.downcase.include?('email does not exist')
=> true

Использование этого дает некоторую гибкость.

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