Decoratorの導入
Decoratorについて
Decoratorとはソフトウェアのデザインパターンのひとつであり、モデルとviewの間に追加する。
「モデル→Decorator→view」のようにviewを装飾するメソッドを追加するときはモデルではなく、デコレーターへ追加する。
Decoratorを導入すればviewにロジックを記述しないことができる。そうすることで、
モデルにはデータベース関連の処理のみを記載し、モデルの肥大化を防ぐことができる。
gem Draper
railsでデコレーター層(プレゼンテーション層)を導入するにはDraperかActive_Decoratorを使用するのが一般的である。
今回はDraperを利用しデコレーター層を導入する。
導入
gem 'Draper' とGemfile記述しbundle installする。bundle後、
$ rails g draper:install create app/decorators/application_decorator.rb
を実行。これでインストールが完了しジェネレーターコマンドが使えるようになる。
UserモデルのDecoratorを生成する。「rails g decorator (モデル名)」
$ rails g decorator User create app/decorators/user_decorator.rb
appにdecoratorsディレクトリとuser_decorator.rbが作成される。
Decorator内にメソッドを追加
class UserDecorator < Draper::Decorator delegate_all def full_name "#{last_name} #{first_name}" end end
delegate_allという記述はUserモデルすべてのメソッドを呼び出せるようにし、UserDecoratorクラスでも使えるようにしている。
これがあることで、Userモデルが所有するメソッド(last_name,first_name)を定義したfull_nameメソッドで使うことができる。
view側でdecoratorメソッドを呼び出す。
<%= current_user.decorate.full_name %>
反映にはサーバーの再起動が必要。