ヘルパーメソッドを自作する方法
先日フリマアプリの製作中に、出品者以外に商品の購入ボタンを表示するという機能を実装しました。その時にヘルパーメソッドを自作してみたので、記録しておきます。
準備
今回は、商品の詳細ページに以下のような購入ボタンを表示したいです。
// 出品者以外に表示したい <%= link_to "購入", "#" %>
こんな感じでifで囲めば良いのですが、この条件式が今回の主題です。
<% if #条件式 %> <%= link_to "購入", "#" %> <% end %>
ここで確かめたいこととしては、
- ユーザーがログインしているのか
- ユーザーはその商品の出品者ではないか
- その商品はまだ購入されていないか
になります。これらをビューファイルに書こうとすると、条件式が長くなるか、ifのネストを繰り返さなければならず、あまりきれいではないです。できないわけではないですが。
というわけで、これらをまとめて判断してくれるavailable?メソッドを自作しました。
ヘルパーメソッドの作り方
作り方は思いのほか簡単でした。appディレクトリの中にhelpersというフォルダがあります。その中に、application_helper.rb
やxx_helper.rb
というファイルがあるので、その中でメソッドを定義するだけです。xx_helper.rb
はコントローラーを作成した時に自動で生成されるファイルです。
そのメソッドをアプリケーション全体で使うのであれば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
のなかで定義 - ヘルパーメソッドを使うとビューファイルがスッキリする