[初心者] decoraterの導入方法、使い方

どうもこんにちは

ヤスケンです!!

今日もプログラミングで学んだことをアウトプットの場として、記録していきます。

 

今回は、decoraterというソフトウェアのデザインパターンを使って、

webページに現在ログインしているユーザーの名前をフルネームで表示するための実装を行っていきます。

 

[:目次]
①Decoraterとは何か 
②使い方
③最後に

 

①Decoraterとは何か

ソフトウェアのデザインパターンの一つです。

デザインパターンとは、先人達が開発をしていく中で「よく出会う問題とそれに対する良い設計」のことを言うそうです。

 

今回の場合だと、viewに表示したいメソッドを追加したいけど、モデルに書くと肥大化してしまうといったことが挙げられます。

 

これを解決するために、decoratorを使っていきます。

decoraterは、modelとviewの中間に位置します。

model → decorator → view

viewにメソッドを書きたいときには、decoratorファイルにメソッドを記載してまとめてviewで呼び出します。

 

話は少し逸れますが、

 

なぜ、modelに書くとダメなのでしょうか?

それは何でもモデルに記載しておくと、すぐにモデルは肥大化してしまいます。
そのため、モデルにはDBにアクセスするような処理のみを記載するようにすることが慣習のようです。

 

また、なぜhelperではダメなのでしょうか?

これは、helperもDecoratorもビューを書きやすくするための仕組みという点では共通しています。
しかしこの2つの役割の違いは
helperはモデルから独立し直接関係していない描画ロジックを実装するのに用います。
それに対して
Decoratorは特定のモデルにがっつり関連した描画ロジックを実装するのに用いる
というものです。

 

 

②使い方

 

では、早速使い方を見ていきましょう。

 

(1) gem でdraperを導入する

 
gem 'draper'
 

Gemfileに記載したら、ターミナルでbundle installを行う。

 

(2)draperを記載するフォルダとファイルを作成していく

#ターミナル
 
#rails generate decorater (モデル名)というコマンドが使えるようなる
 #app/decoraters/application_decorater.rb というファイルが作成される
% rails generate draper:install
 
 

 

#ターミナル
  
 #app/decoraters/user_decorater.rb というファイルが作成される 
% rails generate decorater User
 

 

(3)app/decoraters/user_decorater.rbにフルネームを表示させるメソッドを作成する

 
class UserDecorator < Draper::Decorator

def full_name
"#{object.last_name} #{object.first_name}"
end
 
end

 

(4)(3)で作成したメソッドを表示したいビューに記載する

#app/views/shared/_header.html.erb
 
<%= current_user.decorate.full_name %>
 

 

これで、ログインしたユーザーの名前がビューに表示されるようになります。

 

③最後に

Decoraterを活用することによって、ビューやモデルが肥大化せずにスマートにコードがかけるようになりました。

ここまで読んでいただき、ありがとうございました。