チワワかわいいブログ

RUNTEQでrails勉強する日々の記録

2020/12/30 decorator

参考

qiita.com

decoratorとは

ソフトウェアのデザインパターンの一つです。
既存のオブジェクトを新しいDecoratorオブジェクトでラップすることで既存の関数やクラスの中身を直接触ることなく、その外側から機能を追加したり書き換えたりする。
また、既存のクラスを拡張する際にクラスの継承の代替手段として用いられます。

基本的にはビューに表示するためのロジックを記述する場所。

helperやモデルに記述しない理由

それぞれの役割分担をきっちりすることでコードをわかりやすく書く必要がある。
モデル→DBにアクセスする処理を書く
helper→モデルから独立しており、モデルに直接関係していない処理を書く
decorator→特定のモデルに関連した処理を書く

導入する
gem 'draper'
#bundle installする

rails generate draper:install
#アプリケーションにデコレーター層(デコレータ用のフォルダ)を作る  

rails generate decorator User
#モデルに紐づいたデコレータファイルを作成する

delegate_allとは、UserモデルのメソッドをUserDecoratorクラスでも使用できるようにするための記述です。これがあることによってuser.nameなどuserモデルが所有するインスタンスメソッドがUserDecoratorクラスのオブジェクトにも使用することが可能となります。

メソッドを定義する
class UserDecorator < Draper::Decorator
  delegate_all

  def full_name
    last_name + ' ' + first_name
  end
end

viewから呼び出すときは

<%= current_user.decorate.full_name %>

のようにdecorate.を記述する