例えば下記のようなコードはviewを肥大化させてしまい、さらに変更(#{@user.midlle_name}
を追加したいなど)があった場合に対応しづらくなってしまう。
<%= "#{@user.first_name} #{@user.last_name}" %>
そこで下記のようなメソッドに切り分けることを考えると思います。
def full_name
end
これをmodelに定義するのか、helperに定義するのか、はたまたdecoratorに定義するのか、そもそもこれらの違いはなんなのか、というのが今回のテーマです。
#model の肥大化を防ぐ
基本的にメソッドはmodelに定義することで実装できます。ただ全てをmodelに書いてしまうとコード量が増え、可視性が悪くなり扱いづらくなってしまいます。
そこで登場するのが helper と decorator 。
これらは基本的にviewの肥大化を防ぐために使われます。viewの共通化やロジックを切るときにはmodelではなく、helper か decorator を使うようにしましょう。
じゃあ、これらは2つはどのように使い分ければ良いのでしょうか?
#helper と decorator の違いについて
###helper
- Modelに依存しないロジック
→ modelにアクセスする際に定数が必要
module ApplicationHelper
def full_name(model)
model.first_name + model.last_name
end
end
- グローバルに有効(アプリケーション内のどこでも使える)という特徴があるので、他のファイルでメソッド名が被ってしまったときに、どちらか一方が使えなくなるという事故に繋がるため注意が必要。
###decorator
- Modelに依存するロジック
→ modelにアクセスする際に定数を必要としない
module UserDecorator
def full_name
first_name + last_name
end
end
-
gem 'draper'
をインストールする必要がある
#まとめ
- 基本はmodelに書く
- viewのロジックでModelに依存しないときはhelper
- viewのロジックでModelに依存するときはdecorator
ちなみに下記のような場合ではdecoratorを使うのが適切かと思います。
<%= "#{@user.first_name} #{@user.last_name}" %>
<変更後>
class UserDecorator
def full_name
first_name + last_name
end
end
<%= @user.decorate.full_name %>