デコレーターの導入
デコレーターとは
既存のクラスに機能を付け加えたい場合や、
既存機能に少しだけ修飾を加えたい場合に使われるパターンです。
色々なモデルで同じようなメソッドを使いたいときに、
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 %>
このように書くとデコレーターで定義したメソッドを使うことができます。