ヘルパーメソッドを自作する方法

f:id:endoakak:20200727195704j:plain

先日フリマアプリの製作中に、出品者以外に商品の購入ボタンを表示するという機能を実装しました。その時にヘルパーメソッドを自作してみたので、記録しておきます。

準備

今回は、商品の詳細ページに以下のような購入ボタンを表示したいです。

// 出品者以外に表示したい
<%= link_to "購入", "#" %>

こんな感じでifで囲めば良いのですが、この条件式が今回の主題です。

<% if #条件式 %>
  <%= link_to "購入", "#" %>
<% end %>

ここで確かめたいこととしては、

  • ユーザーがログインしているのか
  • ユーザーはその商品の出品者ではないか
  • その商品はまだ購入されていないか

になります。これらをビューファイルに書こうとすると、条件式が長くなるか、ifのネストを繰り返さなければならず、あまりきれいではないです。できないわけではないですが。

というわけで、これらをまとめて判断してくれるavailable?メソッドを自作しました。

ヘルパーメソッドの作り方

作り方は思いのほか簡単でした。appディレクトリの中にhelpersというフォルダがあります。その中に、application_helper.rbxx_helper.rbというファイルがあるので、その中でメソッドを定義するだけです。xx_helper.rbはコントローラーを作成した時に自動で生成されるファイルです。

f:id:endoakak:20200807091923p:plain:h100

そのメソッドをアプリケーション全体で使うのであればapplication_helper.rbに、xxだけでしか使わないならxx_helper.rbに記述するということでいいのだと思います。

今回はitems_helper.rbに以下のような記述をしました。

module ItemsHelper
  def available?(item)
    # ログインしているかチェック
    unless user_signed_in?
      return false
    end

    # 出品者ではないかチェック
    if item.user.id == current_user.id
      return false
    end

    # 商品が売り切れていないかチェック
    # dealは購入に関するテーブル
    if item.deal
      return false
    end

    # 全部通り抜けた商品は購入可能
    return true
  end
end

Rubocopさんにはかなり不評だったので、書き方についてはこれが理想ではないかも。でも見やすさ重視で書きました。

これで、ビューファイルでavaialble?メソッドを使えます。

ビューファイルでヘルパーメソッドを使ってみる

メソッドを作ったので、ビューファイルの購入ボタンはこのように書けます。

<% if available?(item) %>
  <%= link_to "購入", "#" %>
<% end %>

かなりスッキリ書けました。

ちなみに、ヘルパーメソッドを使わないとこんな感じかな?

<% if user_signed_in? %>
  <% if item.user.id != current_user.id %>
    <% if !item.deal %>
      <%= link_to "購入", "#" %>
    <% end %>
  <% end %>
<% end %>

まとめ

  • ヘルパーメソッドはapp/helpers/xx_helper.rbのなかで定義
  • ヘルパーメソッドを使うとビューファイルがスッキリする