学習記録

アウトプット用に作りました

デコレーターの導入

デコレーターとは

既存のクラスに機能を付け加えたい場合や、
既存機能に少しだけ修飾を加えたい場合に使われるパターンです。

色々なモデルで同じようなメソッドを使いたいときに、
userモデルでもcommentモデルでも定義していたら手間です。

またモデルで定義することもできますが、
このメソッドはビューの表示部分のロジックを担っているので、
その責務をモデルには持たせたくありません。

なのでこのようなときにデコレータを使用します。
デコレーターは対応したモデルのビューへの表示フォーマットのためのロジックを請け負ってくれます。


draperを導入

Railsでデコレーター層を導入したい場合、Draper もしくはActive_Decoratorを使用するのが一般的です。
gem draperをgemfileに追加後、bundle installを行います。


$ rails g draper:install

これを使ってapp/decorators/application_decorator.rbが生成されます。


$ rails g decorator user

これでapp/decorators/user_decorator.rbが生成されます。
指定したuserモデルに対応したデコレーターファイルを作ることができました。


user_decorator.rbファイルの中身を編集していきます。
ユーザーのフルネームを定義するメソッドを追加します。

class UserDecorator < Draper::Decorator
  delegate_all

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

delegate_allはデコレーターファイルを生成すると最初から書かれていました。
この記述があることで、デコレーターに存在しないメソッドがコールされたときは、
モデルの処理が実行されるようになります。

object.はデコレートしているモデルを参照するメソッドです。
delegate_allの記載があれば、object.は記述しなくても大丈夫です。


ビューファイルで呼び出すときは、

<%= current_user.decorate.full_name %>

このように書くとデコレーターで定義したメソッドを使うことができます。