箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

ぼっち演算子とpresence【Rails】

f:id:y_hakoiri:20191102121618j:plain


 

業務に入ってから、「エラーハンドリング」の重要性をひしひしと感じています。

 

やっぱりイチ企業のサービスとなると、エラーが起こっては困るので

コードの至る所に対処が散りばめられているんですね。。

ポートフォリオなんかでなんとなくやっていたのとは桁違いです。

 

ということで、最近使ったエラー対処法をいくつかまとめようかなと思います。

 

&.

通称、ぼっち演算子

何をしてくれるかというと、レシーバが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

 

qiita.com