リファクタリングとはプログラミングにおいて、プログラムの動作を変えずにコードの内部構造を整理すること、つまりコードを見やすくすることを言う。
修正前
<% if user_signed_in? && current_user.id == @item.user_id && @item.purchase.blank? %>
<%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %>
<p class="or-text">or</p>
<%= link_to "削除", item_path, method: :delete, class:"item-destroy" %>
<% else user_signed_in? %>
<% if @item.purchase.blank? %>
<%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%>
これはフリマアプリの一例で、ユーザーのログイン状態において出品した商品の編集、削除ボタンが表示されるか、もしくは購入ボタンが表示されるかの条件分岐を記述したものである。
これだと1行目に「ログインしていればかつ現在ログイン中のユーザー、出現在ログインしているユーザーが商品の出品者であればかつ商品は売れていなければが同じである」というややこしい表記法になっている。
さらに5行目にまたuser_signed_in?があり、6行目に商品は売れていなければの記述で購入画面に進むを表示させる制御をしている。
そこで下記のようにリファクタリングしてみる。
<% if user_signed_in? || @item.purchase.blank? %>
<% if current_user.id == @item.user_id %>
<%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %>
<p class="or-text">or</p>
<%= link_to "削除", item_path, method: :delete, class:"item-destroy" %>
<% else %>
<%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%>
<% end %>
<% end %>
1行目に大きな条件として"ログインしていれば" かつ "商品は売れていなければ"を記述、2行目に"現在ログインしているユーザーが商品の出品者であれば"をif文のネスト構造で記述して「商品の編集」「削除」を表示させるか 「購入画面に進む」を表示させるかを制御している。
1行にまとめるよりも2行に分けたほうが後々わかりやすく重複しない。