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 %>

反映にはサーバーの再起動が必要。