業務に入ってから、「エラーハンドリング」の重要性をひしひしと感じています。
やっぱりイチ企業のサービスとなると、エラーが起こっては困るので
コードの至る所に対処が散りばめられているんですね。。
ポートフォリオなんかでなんとなくやっていたのとは桁違いです。
ということで、最近使ったエラー対処法をいくつかまとめようかなと思います。
&.
通称、ぼっち演算子
何をしてくれるかというと、レシーバがnilじゃなかった時だけメソッドを実行してくれます。
例えば、current_userがnilだった場合
(index.html.haml)
```
= current_user.name
```
nilに対してnameメソッドは使えないので、NameErrorが出ますね。
じゃあ、current_userが存在する時だけnameメソッドを実行すれば良いんだ!
```
if current_user.present?
= current_user.name
```
なんて冗長な書き方(笑)
今だったら笑っちゃいますけど、少し前までこう書いてました、ええ
ちなみに、余談ですが↑のif文の2行は
= current_user.name if current_user.present?
とか
= current_user.name if current_user
とも書けますね。
(if文は倒置できるし、presentは省略できる)
ここでは「もしcurrent_userがあったらそのnameを表示してね」
ってやってるんですけど、そんなめんどくさい事をしなくても
```
= current_user&.name
```
これだけでオッケーなんですね。便利!!
このぼっち演算子と同じようなものにtryとかtry!がありますが
ほぼ同義かな?ちゃんと調べてないけど。。
でも&.の方が見やすくて良いですよね。
presence
今回私が特にお世話になったのはこちら。
先ほどのぼっち演算子は
レシーバがnilだった時対策ですが、
例えば後からカラム(メソッド)を追加した場合
```
= current_user.status
```
既存のレコードにはstatusカラムの値が存在しないので、
current_user自体は存在していても
statusメソッドがNoMethodErrorを引き起こしてしまいます。
そっか、ぼっち演算子はcurrent_userのnil対策には使えたけど、
メソッドを含めた返り値がnilの場合の対策はどうするんだろう。。
「あったら表示」を端的に叶えたい!!
そこで使えたのがpresence
presenceメソッドは、present?を実行し
結果がtrueだったらselfを返してくれる、なんとも気の利くメソッドです
```
= current_user.status.presence
```
こうする事で、current_user.statusが存在したら表示してくれる。
これもめちゃくちゃ便利だ。。
まとめ
- オブジェクトにはぼっち演算子
- メソッドにはpresence
で大抵は解決しそうな気がします。
参考
kossy-web-engineer.hatenablog.com