はじめに
Railsの勉強をしている際、「メソッドの最後に!
がついているけど何だこれは???」と思ったことがありました。Rubyの場合は!
で否定演算子や!!
でメソッドの返り値をtrue/falseにするなどがありますが、今回はRailsメソッドの感嘆符!
について説明していこうと思います。
#感嘆符!
とは
感嘆符とはエクスクラメーションマークのことです。以下Wikipediaより
(かんたんふ)とは、約物のひとつで、「!」 と書き表される。 雨垂れ、または俗にビックリマークとも呼ばれる。 また英語表記に由来した呼称「エクスクラメーション・マーク (exclamation mark)」と呼ばれることもある。
!
をつけるとつけないとでは何が違うのか?
よく使われるメソッドでcreate
やsave
などがあります。これらの処理を実行しレコードの作成、保存に失敗した際、通常の場合はnil
を返します。しかし、create!
、save!
のように!
をつけることによりActiveRecord::RecordNotFoundエラー
を発生させることができます。
つまり!
をつけることにより、例外を発生させるか発生させないかの違いです。
create!
、save!
→ レコードの作成・保存に失敗 → 例外を発生させる
create
、save
→ レコードの作成・保存に失敗 → nilを返す
save
メソッドの場合は保存の成功と失敗を true/false で返すのに対して、save!
メソッドは保存を失敗した場合に例外を返します。つまり、save!
を使えば例外をトリガーにしてロールバックなどの処理を行うことができるため、比較的使用頻度が高いかと思います。
補足:そもそも例外処理とは?
プログラムがある処理を実行している途中で、なんらかの異常が発生した場合に、現在の処理を中断(中止)して、別の処理を行うこと。その際に発生した異常のことを例外と呼ぶ
つまり、プログラムがすんなり通らなかったときに行う処理のことを指します。理想とは違う処理が例外という解釈でもいいと思います。
#まとめ
- メソッドの最後に
!
をつけることにより、レコードの作成などに失敗した際の挙動をかえることができる。
→ 例外処理を書く際に利用できる。