ensure節の値は無視される

何回か読んでいてわかっているはずなのにまたやってしまったので、忘れないように書いておきます。

間違った例

def wrong_case
  hs = {}
  hs[:login] = "123"
  hs[:email] = params[:user][:email]    # params[:user]==nilだと例外発生
  hs[:ipadr] = "127.0.0.1"
rescue
ensure
  hs
end

これで Hashが返ってくると思いきや、エラーがなければ "127.0.0.1"が返ってきます。エラーの場合は nilが返ります。

正しい例

def correct_example
  hs = {}
  hs[:login] = "123"
  hs[:email] = params[:user][:email]    # params[:user]==nilだと例外発生
  hs[:ipadr] = "127.0.0.1"
  hs
rescue
  hs
end

これだとエラーがなければ期待した通り Hashが、エラーでもエラーが起きる前までにセットした Hashが返ります。この場合は、{:login=>"123"}
『ensureは戻り値に関係ない処理』と覚えておくこと。