デコレーターの導入

decoratorとは

デザインパターンの1つDecoratorパターンと言うものが存在し、
これは、既存のクラス(オブジェクト)にラップすることで、機能を付け加えたい場合や、
既存の機能に少しだけ修飾を加えたい場合に使われるパターン

Draperとは?

railsでモデルの情報をviewにそのまま送るのではなく、viewとモデルの間にプレゼンテーション層(decorator層)というモデルやビューに実装されやすい表示ロジック/フォーマットを記述する役割を担う層を作成してくれるgem

使い方

Gemfileに以下を記述してbundle install

gem 'draper'

次に

rails generate draper:install

を実行することで、

rails generate decorator モデル名

といったコマンドが使えるようになる。このコマンドを実行することで
app/decorate/ディレクトリ以下にモデル名_decorator.rbと指定したモデルのデコレーターが作成される
例えばuserモデルを指定したデコレータファイルは以下のような感じになる

class UserDecorator < ApplicationDecorator
  delegate_all
   ・
   ・
   ・
end

ここで、delegate_allは指定したUserモデルのメソッドをUserdecoratorクラスでも呼び出せるようにしてくれる記述
ここで例えばuserモデルの属性に(last_name)と名(first_name)がある場合、これをビューではつなげて表示したい時、
姓部分と名部分をつなげるメソッドをdecoratorファイルに作成して、ビューでメソッドを実行するということができる
記述するとこんな感じになる

class UserDecorator < Draper::Decorator
  delegate_all

  def full_name
    "#{object.last_name} #{object.first_name}"
  end
end

ビューで使う場合は以下のような記述になる

<%= current_user.decorate.full_name %>

なぜモデルにメソッドを記述してはいけないのか?

モデルの肥大化を防ぐため、モデルに記載することはdbにアクセスする
ような処理などできるだけ少なくする!!

helperとの違いって?

helperはモデルから独立して、直接関係ないビューロジックを実装するのに用いられる。
decoratorは特定のモデルに関連したビューロジックなどを実装するのに用いられる。

参考文献

GitHub - drapergem/draper: Decorators/View-Models for Rails Applications

Decoratorの役割とDraperについて - Qiita