プログラミング学習記録

主にRuby on Railsを使ったプログラミングを学んでいます。

Draper

Draperとは

Railsで利用できる、Decoratorを導入するためのGem。
※Decoratorとはソフトウェアのデザインパターンの一つ。既存のオブジェクトに新しい機能や振る舞いを動的に追加するためのもの。

どんな場合に使用するか

Modelの情報をViewで表示しようとする場合、Viewを装飾するメソッドを追加したいがModelに書くとModelが肥大化してしまう。もちろんViewに書くと重複が多くなり、可読性が低下する。
helperに書いても動きはするが、scopeの問題があり、名前空間がグローバルなのでメソッド名が衝突する危険性がある。また、メソッドを想定していない使い方をしてバグの原因になりかねない。
よって、以下のような使い分けをすると良い。

  • helper   Modelから独立し関係していない表示ロジック
  • Decorator   一つのModelに関連した表示ロジック

導入

インストール

#Gemfile
gem 'draper'
$ bundle install

次にデコレーター層を追加するために以下を実行

$ rails generate draper:install

この後は

$ rails generate decorator ○○(モデル名)

で指定したモデルに対応したデコレーターファイルが作成される。

app/decorators/○○_decorator.rb

class ○○Decorator < Draper::Decorator
  delegate_all
  
  #ここにメソッドを書く
end

Modelがファットにならないようにするために使う。
Draperを使えばよりDRYに、よりオブジェクト志向的に書ける。

参考サイト

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

Decorator と Presenter を使い分けて、 Rails を ViewModel ですっきりさせよう - KitchHike Tech Blog

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

Rails Viewの表示のためにDecoratorを用意してHelperとModelを助ける - Qiita

Decorator パターン - Wikipedia

Draperの使い方 まとめ - 猫Rails