はじめに
if文と論理演算子を組み合わせたときに、気をつけるべき点があったので、まとめておく。
基本的な記述
if 条件式
#条件式がtrueのときの処理
else
#条件式がfalseのときの処理
end
論理演算子
&&→かつ
||→または
if文と論理演算子の組み合わせ
if 条件式1 && 条件式2
#条件式1と条件式2がtrueのときの処理
else
#条件式の一つでもfalseがあるときの処理
end
細かくみると、条件式1がfalseの場合、条件式2のコードはそもそも読まれない。
具体的には、
<% if user_signed_in? && @message.user.id == current_user.id %>
<% if @message.user.id == current_user.id && user_signed_in? %>
deviseを用いて、ログイン状態と非ログイン状態で表示を分ける場合、
ログインしていれば、どちらのコードでもエラーは起きない。
しかし、非ログイン状態の場合、
上のコードでは、エラーは起きないが、下のコードだと、エラーになってしまう。
その原因は、@message.user.idとcurrent_user.idはログインしている状態でないと、値が入らず、そもそも==で等しいかどうか、判別することができない。
一方、上の式では、user_signed_in?の時点で、非ログイン状態だと、falseが返るので、&&以降のコードを判別に使わずに済む。