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