Help us understand the problem. What is going on with this article?

【Rails】Helperを使ってよりDRYなviewを書こう

More than 5 years have passed since last update.

HelperでviewをDRYに

Helperとは、viewをよりシンプルにDRYに書くためのモジュール。view以外もhelpできるけど、基本的にはviewをhelpしてくれるものだと抑えましょう。

<%= form_tag %>とか<%= link_to %>とか...。Railsを書いていてこれらを使ったことがない人はいないでしょう。
こいつらはrailsがデフォで準備してくれてる便利なヘルパーたち。そのシンプルさDRYさは言わずもがな。

helperを作ろう

デフォで用意されてるhelperは汎用的なもの。自分のアプリで繰り返し登場するコードや、viewのコードを汚くしてるものには、helperを定義してSimpleにDryにしてあげよう。

使用例1: 繰り返し出てくる文言

あんまりhtmlに繰り返し使う文言はベタ打ちしたくないよね。変更があったら全ていちいち変えなきゃいけないし。
そんな時にhelperを使おう。

例えば、"〜人"っていう表示をよくするとする。〜の部分に色んな数字がパラメータで入るイメージ。

app/helpers/application_helper.rb
module ApplicationHelper
  def person(value)
    "#{value}人"
  end 
end
app/view/some.html.erb
...
  <%= person person_count %>
...

とかしてやると、person_countという変数の数 + '人'のかたちで、viewで反映されるのがわかる。
これで繰り返し出て来る文言を全ての場所でそれぞれ定義することなく、管理がラクになる。

使用例2: viewのロジックをhelperで吸収

例えば、あるコントローラーにactionが3つあったとする。んで、3つのアクションでrenderされるviewが同じだけど、appleの時は、view上のナビバーのappleをactiveに、bananaの時は、view上のナビバーのbananaをactiveに、grapeの時は、view上のgrapeをactiveに、みたいにしたいとする。

app/controller/fruit_controller.rb
...
def apple
  ...
  render same
end
def banana
  ...
  render same
end
def grape
  ...
  render same
end
...

helperを使ってどれをactiveにするかの振り分けをスマートにしたる。

app/view/same.html.erb
<div class = <%= active_class "apple" %>>
  apple
</div>
<div class = <%= active_class "banana" %>>
  banana
</div>
<div class = <%= active_class "grape" %>>
  grape
</div>
app/helper/application_helper.rb
...
  def active_class(target_action)
    if params[:action] == target_action
      return "active"
    end
  end
...

とすると、actionがそれぞれのときに、それぞれの該当するクラスのみにactiveクラスを与えるのが、こんなにシンプルで、柔軟で汎用的にかけると。素晴らし。


controllerでもhelperを支えたり、helperが読み込まれるタイミングだったり、helperもnamespace使って管理したりと、いろいろとまだhelperに関して知る余地はあるので、興味のある方はもっと調べてみてください。

参考

finc
健康寿命を伸ばすアプリFiNCの開発・運営を行うモバイルヘルステクノロジーベンチャー
https://finc.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away