did_you_mean 1.2.0 から KeyError に対して key の予測候補が出せるようになったので、これを使って key を間違ってもアクセス出来るようにします。
key の候補を取得するのには DidYouMean::KeyErrorChecker
を使用します。
Hash.prepend Module.new {
def [](key)
fetch(key)
rescue KeyError => ex
orig_key = key
key = DidYouMean::KeyErrorChecker.new(ex).corrections.first
return super(orig_key) if key.nil?
if key.start_with?(':')
super(key[1..-1].to_sym)
else
super(key)
end
end
}
hash = {
user: {
name: 'foo'
}
}
p hash[:usre][:namee] #=> "foo"
まず []
メソッドはそのままでは key が存在しない場合にエラーが出ないので fetch
を使用するように書き換えておきます。その後、KeyError の例外をキャッチして候補を探し出し、候補が存在していればその値を存在しない場合は nil
を返すようにしています。
これで key を間違ってもある程度アクセス可能な Hash にすることが出来ました