LoginSignup
282
261

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-11

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に関して知る余地はあるので、興味のある方はもっと調べてみてください。

参考

282
261
1

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
282
261