module DidYouMean

Das DidYouMean Gem fügt Funktionalität hinzu, um mögliche Methoden-/Klassennamen bei Fehlern wie NameError und NoMethodError vorzuschlagen. In Ruby 2.3 oder höher wird es beim Start automatisch aktiviert.

@example

methosd
# => NameError: undefined local variable or method `methosd' for main:Object
#   Did you mean?  methods
#                  method

OBject
# => NameError: uninitialized constant OBject
#    Did you mean?  Object

@full_name = "Yuki Nishijima"
first_name, last_name = full_name.split(" ")
# => NameError: undefined local variable or method `full_name' for main:Object
#    Did you mean?  @full_name

@@full_name = "Yuki Nishijima"
@@full_anme
# => NameError: uninitialized class variable @@full_anme in Object
#    Did you mean?  @@full_name

full_name = "Yuki Nishijima"
full_name.starts_with?("Y")
# => NoMethodError: undefined method `starts_with?' for "Yuki Nishijima":String
#    Did you mean?  start_with?

hash = {foo: 1, bar: 2, baz: 3}
hash.fetch(:fooo)
# => KeyError: key not found: :fooo
#    Did you mean?  :foo

Deaktivieren von did_you_mean

Gelegentlich möchten Sie möglicherweise das did_you_mean Gem deaktivieren, z. B. um Probleme im Fehlerobjekt selbst zu debuggen. Sie können es vollständig deaktivieren, indem Sie die Option --disable-did_you_mean für den ruby Befehl angeben.

$ ruby --disable-did_you_mean -e "1.zeor?"
-e:1:in `<main>': undefined method `zeor?' for 1:Integer (NameError)

Wenn Sie keinen direkten Zugriff auf den ruby Befehl haben (z. B. +rails console+, irb), können Sie Optionen über die Umgebungsvariable RUBYOPT anwenden.

$ RUBYOPT='--disable-did_you_mean' irb
irb:0> 1.zeor?
# => NoMethodError (undefined method `zeor?' for 1:Integer)

Abrufen der ursprünglichen Fehlermeldung

Manchmal möchten Sie das Gem nicht vollständig deaktivieren, sondern die ursprüngliche Fehlermeldung ohne Vorschläge erhalten (z. B. beim Testen). In diesem Fall können Sie die Methode original_message auf dem Fehlerobjekt verwenden.

no_method_error = begin
                    1.zeor?
                  rescue NoMethodError => error
                    error
                  end

no_method_error.message
# => NoMethodError (undefined method `zeor?' for 1:Integer)
#    Did you mean?  zero?

no_method_error.original_message
# => NoMethodError (undefined method `zeor?' for 1:Integer)