Bekerja di Rails 4.2 dan Ruby 2.3.3

Saya berurusan dengan API yang memiliki kesalahan dalam keadaan tertentu tetapi tidak dalam keadaan lain. Saya ingin memeriksa untuk melihat apakah kunci kesalahan itu ada dan, jika ya, turunkan dan cari keberadaan sesuatu. Seperti ini di mana parsed adalah hash:

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

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

Saya dapat melihat Dig mengembalikan nihil dalam kasus ini. Apakah ada cara saya dapat mengatakan bahwa pernyataan if untuk keluar jika nil? Mungkin memaksanya untuk salah dan keluar tanpa menambahkan banyak kode upacara?

Saya tahu saya bisa melakukan sesuatu seperti ini tetapi tampaknya tidak praktis:

unless parsed['error'].nil?
  return true  if parsed.dig('error').downcase!.include?('email does not exist') # refactor
end
1
ibpix 13 Maret 2020, 23:16

1 menjawab

Jawaban Terbaik
parsed.dig('error').to_s.downcase.include?('email does not exist')

to_s mengonversi nil menjadi ''. Tidak perlu downcase! karena Anda tidak perlu mengubah objek asli dan karena itu mengembalikan nil jika tidak ada perubahan yang dibuat; cukup gunakan downcase.

Perhatikan bahwa contoh Anda menggunakan kunci yang disimbolkan dan kode Anda menggunakan kunci yang dirangkai, sehingga tidak akan pernah cocok:

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

Karena Anda menggunakan Rails, Anda dapat membuat hidup Anda sedikit lebih mudah dengan akses acuh tak acuh. Ini memungkinkan kunci hash diakses dengan string atau simbol:

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

Menggunakan ini memberi Anda beberapa fleksibilitas.

1
anothermh 13 Maret 2020, 20:44