Decoratorの説明の前に例え話から。
Modelでは日時を”2018-07-12 18:12:34”という値で保持していますが、Viewでは”2018/7/12”と表示したい場合を考える。
前提としてモデルはデータの格納に関する情報だけを書くところ。ビューは情報を表示する役割だけを担うべき。じゃあ上の”2018-07-12 18:12:34”を”2018/7/12”に変える処理はビューとモデルのどちらに書くべきか?
正解はビューとモデルのどちらでもなくDecoraterに書くべき。
話が遅くなったがDecoraterとは名前の通りデコレーターで、情報を加工する処理を書き込む。
それはビューとモデルの間に置く。
Decoraterを実装する
Decoraterを実装するにはDraperというgemを使う。
gem 'draper'
でbundle install
を実行。
###Decoraterを使って置き換えを行う。
1、decoratorのメソッドを定義するファイルを作成する。
以下のコマンドである。
rails g decorator モデル名
userとしたのはモデル名である。今回はlast_nameとfirst_nameというuserモデルのカラムを扱うので、モデル名はuserとする。
2,作成したdecorator.rb
にメソッドを定義する。
今回はuserモデルのlast_nameとfirst_nameを結合してフルネームを返すfull_name
メソッドを定義する。
class UserDecorator < Draper::Decorator
delegate_all
def full_name
"#{last_name} #{first_name}"
end
end
これでuserインスタンス
に対してメソッドが使えるようになるが、注意点が一つある。
3,実際にビューファイルに出力してみる。
<%= current_user.decorate.fullname %>
定義したfull_nameメソッドを使用するには上記のようにdecorate
メソッドを経由しなければいけない!
以上。
[補足]Decoratorを使う場所
・コントローラー → ×
表示に関わるファイルでのみ使用するので。(showアクションなどでフルネームを表示したい場合だったら使う。)
・ビュー → ○
表示に関わるファイルでのみ使用するので。
・モデル → ×
表示に関わるファイルでのみ使用するので!!!
(今回みたいにモデル内でフルネームを扱いたい場合は、モデル内でfull_name
メソッドを定義すれば良い)