🤍
[Rails]でto_iしたときに0にしたくない。Integer()したときに例外を起こしたくないときの対処法
概要
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