3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

helper と decorator の使い分け

Posted at

例えば下記のようなコードはviewを肥大化させてしまい、さらに変更(#{@user.midlle_name} を追加したいなど)があった場合に対応しづらくなってしまう。

<%= "#{@user.first_name} #{@user.last_name}" %>

そこで下記のようなメソッドに切り分けることを考えると思います。

  def full_name
  end

これをmodelに定義するのか、helperに定義するのか、はたまたdecoratorに定義するのか、そもそもこれらの違いはなんなのか、というのが今回のテーマです。

#model の肥大化を防ぐ

基本的にメソッドはmodelに定義することで実装できます。ただ全てをmodelに書いてしまうとコード量が増え、可視性が悪くなり扱いづらくなってしまいます。

そこで登場するのが helperdecorator

これらは基本的にviewの肥大化を防ぐために使われます。viewの共通化やロジックを切るときにはmodelではなく、helperdecorator を使うようにしましょう。

じゃあ、これらは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'をインストールする必要がある

#まとめ

  1. 基本はmodelに書く
  2. viewのロジックでModelに依存しないときはhelper
  3. 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 %>
3
0
0

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?