🤍

[Rails]でto_iしたときに0にしたくない。Integer()したときに例外を起こしたくないときの対処法

2022/08/30に公開

概要

RailsでStringをIntegerにキャストしたいとき

[1] pry(main)> "".to_i
=> 0

to_i を使うと数字以外の文字が 0 になってしまい、

[2] pry(main)> Intege("")
ArgumentError: invalid value for Integer(): ""

Integer() を使うと例外が起きてしまう。

キャストする文字列が "0" が入らない前提であれば、 "".to_i して 0 だったら分岐するようなコードを書けば問題ないが、文字列 "0" に対応したい & もう少しスマートに扱いたいので、以下のようなメソッドを定義する。

Object#to_i_or_nil をモンキーパッチで定義する。
レシーバを Integer() でキャストできるときはキャストして、できないときは nil を返す

実装

# /lib/ext/object.rb

class Object
  # @return [Integer, nil]
  def to_i_or_nil
    Integer(self)
  rescue StandardError
    nil
  end
end
# config/initializers/extensions.rb

require 'ext/object'

使い方

[1] pry(main)> "".to_i_or_nil
=> nil
[2] pry(main)> "0".to_i_or_nil
=> 0
[3] pry(main)> "1".to_i_or_nil
=> 1

Discussion