概要
変数に対してメソッドチェインの途中で String#capitalize
等の String
クラスのメソッドが挟まる場合、変数の初期段階で Object#to_s
を読んでおくと不用意に Nil#some_method
が出てしまうことを回避できる。
詳細
Object#to_s
は、 Object
が nil
の場合、 ''
を返す。
Rubyでは(Rubyに限らないが)、メソッドチェインを使用して、複数のメソッドを連続で呼ぶ事がよくある。この時、 String#capitalize
等のString
クラスのメソッドをチェインする場合、チェイン途中に nil
が居ると都合が悪い。つまり、 Nil#some_method
を呼び出そうとして、 NoMethodError
が出てしまうのである。
これを避けるため、変数に対して希望のメソッドを呼ぶ前に、 Object#to_s
を読んでおくと、 Object
が nil
だった場合に ''
が返るため、 Nil#some_method
を呼び出してしまって NoMethodError
にぶつかってしまうことを避けられる。
具体例
下記の例を考えてみる。
params[:given_name].capitalize
params[:given_name]
にString
が入っていれば何の問題も無いが、nil
の場合は前述の通り NoMethodError
になってしまう。これはこのように書き換えるのがおすすめである。
params[:given_name].to_s.capitalize
注意
目的に応じて、本当に Object#to_s
して良いかは各自で判断する必要がある。場合によっては、 NoMethodError
で落とした方が間違いに気づけて良い場合もある。