デコレーターの導入
decoratorとは
デザインパターンの1つ、Decoratorパターンと言うものが存在し、
これは、既存のクラス(オブジェクト)にラップすることで、機能を付け加えたい場合や、
既存の機能に少しだけ修飾を加えたい場合に使われるパターン
Draperとは?
railsでモデルの情報をviewにそのまま送るのではなく、viewとモデルの間にプレゼンテーション層(decorator層)というモデルやビューに実装されやすい表示ロジック/フォーマットを記述する役割を担う層を作成してくれるgem
使い方
Gemfileに以下を記述してbundle install
gem 'draper'
次に
rails generate draper:install
を実行することで、
rails generate decorator モデル名
といったコマンドが使えるようになる。このコマンドを実行することで
app/decorate/ディレクトリ以下にモデル名_decorator.rbと指定したモデルのデコレーターが作成される
例えばuserモデルを指定したデコレータファイルは以下のような感じになる
class UserDecorator < ApplicationDecorator delegate_all ・ ・ ・ end
ここで、delegate_allは指定したUserモデルのメソッドをUserdecoratorクラスでも呼び出せるようにしてくれる記述
ここで例えばuserモデルの属性に(last_name)と名(first_name)がある場合、これをビューではつなげて表示したい時、
姓部分と名部分をつなげるメソッドをdecoratorファイルに作成して、ビューでメソッドを実行するということができる
記述するとこんな感じになる
class UserDecorator < Draper::Decorator delegate_all def full_name "#{object.last_name} #{object.first_name}" end end
ビューで使う場合は以下のような記述になる
<%= current_user.decorate.full_name %>
なぜモデルにメソッドを記述してはいけないのか?
モデルの肥大化を防ぐため、モデルに記載することはdbにアクセスする
ような処理などできるだけ少なくする!!
helperとの違いって?
helperはモデルから独立して、直接関係ないビューロジックを実装するのに用いられる。
decoratorは特定のモデルに関連したビューロジックなどを実装するのに用いられる。
参考文献
GitHub - drapergem/draper: Decorators/View-Models for Rails Applications