はじめに
現在アプリ開発のカリキュラムに取り組んでいます。今までやったカリキュラムを参考にしつつ条件分岐の書き方?の知識を少しアップデートしておきたいと思います。
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
どういう状況だったのか
もともと私が書いていたコードでは自分が投稿したポストに対してもお気に入りボタンが表示されている状態でした。
まぁ、単純に以下のようなコードを書いていたので当たり前といえば当たり前。
<div class="my-auto">
<%= render 'posts/favorite_buttons', post: post %>
</div>
unlessを使用したコード
どうすればいいのか色々探ってみるといい例があり次のように変更しました
<div class="my-auto">
<% unless post.user_id == current_user.id %>
<%= render 'posts/favorite_buttons', post: post %>
<% end %>
</div>
if
ではなくunless
を使う方法!!
ちょっと解説
post.user_id == current_user.id
は「投稿のユーザーIDと現在ログインしているユーザーのIDが同じであるかどうか」を確認しています。
-
post.user_id
: 投稿を作成したユーザーのID。 -
current_user.id
: 現在ログインしているユーザーのID。
この2つが等しい場合(post.user_id == current_user.id
)、その投稿はログイン中のユーザーが作成したものということになります。
でもunless
を使うことで・・・
unless
は「〜でない場合」という条件を表すため、「post.user_id == current_user.id
が成り立たないとき」つまり「投稿のユーザーIDと現在ログインしているユーザーのIDが同じでないとき」に実行されます。
ifを使用したコード
<div class="my-auto">
<% if post.user_id != current_user.id %>
<%= render 'posts/favorite_buttons', post: post %>
<% end %>
</div>
-
unless post.user_id == current_user.id
の代わりに、if post.user_id != current_user.id
と書くことで、「自分の投稿でない場合」にお気に入りボタンを表示する条件を表現しています。 -
!=
は「等しくない」ことを意味する演算子で、==
の否定となります。
おまけ
ついでに課題の方もifとunlessで両方比べてみると下記のようになりました
<% if current_user.own?(board) %>
<div class='ms-auto'>
<%= link_to edit_board_path(board), id: "button-edit-#{board.id}" do %>
<i class="bi bi-pencil-fill"></i>
<% end %>
<%= link_to board_path(board), id: "button-delete-#{board.id}", data: { turbo_method: :delete, turbo_confirm: t('defaults.delete_confirm') } do %>
<i class="bi bi-trash-fill"></i>
<% end %>
</div>
<% else %>
<%= render 'bookmark_buttons', { board: board } %>
<% end %>
<% unless current_user.own?(board) %>
<%= render 'bookmark_buttons', { board: board } %>
<% else %>
<div class='ms-auto'>
<%= link_to edit_board_path(board), id: "button-edit-#{board.id}" do %>
<i class="bi bi-pencil-fill"></i>
<% end %>
<%= link_to board_path(board), id: "button-delete-#{board.id}", data: { turbo_method: :delete, turbo_confirm: t('defaults.delete_confirm') } do %>
<i class="bi bi-trash-fill"></i>
<% end %>
</div>
<% end %>
if
では「自分が所有者であれば編集・削除ボタンを表示」
unless
では「自分がboardの所有者でない場合ブックマークボタンを表示」
動作は同じ。少し論理が反転しただけ。
さいごに
unless
とif
と演算子の組み合わせでこのようなコードの書き方があることを知ることができてよかったです。if
の方がぱっとみわかりやすいのかな。現場を知らないのでなんとも。
今回の記事が何か参考になれば幸いです。