0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【豆知識】条件分岐。if とunless と演算子

Last updated at Posted at 2024-09-14

はじめに

現在アプリ開発のカリキュラムに取り組んでいます。今までやったカリキュラムを参考にしつつ条件分岐の書き方?の知識を少しアップデートしておきたいと思います。

環境

  • 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の所有者でない場合ブックマークボタンを表示」

動作は同じ。少し論理が反転しただけ。

さいごに

unlessifと演算子の組み合わせでこのようなコードの書き方があることを知ることができてよかったです。ifの方がぱっとみわかりやすいのかな。現場を知らないのでなんとも。
今回の記事が何か参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?