##decoraterとは
Decoratorというデザインパターンを導入することで、ビューファイルにロジックを記述しないことが出来る。
使用イメージとしてはModelとViewの中間にデータの加工の役割を担うもの。これらを使えるようにするため、gemをインストールする。
##Draper導入
まず最初にgemをインストール。
#Gemfile
gem 'draper'
$ budle install
次にセットアップ。
# app/decorators/application_decorator.rb を作成
# ApplicationDecoratorは全てのDecoratorの親クラスになる
$ rails generate draper:install
##Draper使用例
データベースにfirst_name: "田中", last_name: "太郎"
という名をviewにてフルネームで表示させようとすると、以下のようになる。
<%= "#{@user.first_name} #{@user.last_name}" %>
もしこれに複雑な加工を追加でする場合、コードが見づらくなってしまう。
そこでDraperでコードを見やすくする。
$rails g decorator User
このコマンドでuser_decorater.rbを作成
以下ファイルにfull_name
を定義。
class UserDecorator < Draper::Decorator
delegate_all
def full_name
"#{object.last_name} #{object.first_name}"
end
end
この処理をするとviewにて@user.decorate.full_name
と記載できるようになる。
<%= "#{@user.first_name} #{@user.last_name}" %>
↓
<%= @user.decorate.full_name %>
もし.decorate
を毎回書くのが面倒なのであれば、コントローラーに下記を加えると省略できる。
@user = User.first.decorate
##model、helper、moduleで記載しない理由
◆model
何でもモデルに記載しておくと、すぐにモデルは肥大化してしまうため。
モデルにはDBにアクセスするような処理のみを記載することで肥大化を防ぐ。
◆helper
helperもDecoratorもビューを書きやすくするための仕組みという点では共通点がある。しかし2つの違いとして
・helperはモデルから独立し直接関係していない
描画ロジックを実装するのに用いる。
・Decoratorは特定のモデルに関連
した描画ロジックを実装するのに用いる。
◆module
moduleで拡張用のメソッドを定義して、モデルのクラスにincludeすれば同じことを再現できるが、これもモデルに記載しているのとあまり変わらない。
もし1人で開発している場合であれば、モジュールがviewのロジック・モデルにはDBのアクセス…というルールのもとで実装できるかもしれないが、
共同開発の場合にはそのルールを共有していない場合、モデルにビューロジックが溢れ出すこととなりやすいためあまりお勧めできない。
##参考記事
Rails decoraterでviewをすっきりさせるメモ
Decoratorの役割とDraperについて
Draperの使い方 まとめ