[Rails] Draperを使ってDecoratorの導入する

学習記録

はじめに

gem draper を使ってデコレーターを導入し、ユーザのフルネームを返すメソッドを定義しましょう。

デコレーターとは?

Decoratorとは、ソフトウェアデザインパターンの一種です。

・・・デザインパターンとは??

Railsにおけるデザインパターンとは、モデルやコントローラ、ビューに頻出する実装パターンを、オブジェクト設計の原則にもとづいて抽象化したパターンのことです。 デザインパターンにしたがうことで、設計上の問題を防ぐことができます。

出典:Railsのデザインパターンまとめ

開発を進めていきコード量が増えると、モデルやコントローラ、ビューが肥大化していきがちです。そうならなために、先人達が試行錯誤の末、体系化したものがデザインパターンということですね。デザインパターンを効率よく利用してスムーズに開発していきましょう。

作業の流れ

  • draper をインストールする
  • デコレーターを作成する
  • デコレーターにメソッドを記述
  • ビューファイルでデコレーターのメソッドを呼び出す

draperをインストールする

gem 'draper'
$ bundle install

gemをインストールしたあとは、

生成されたすべてのデコレーターが継承するApplicationDecoratorを作成するコマンドを入力します。

$ rails generate draper:install

デコレーターを作成する

まず、Userモデルに関するデコレータを作成します。

$ rails generate decorator User

app/decorators/user_decorator.rbが生成されます。

デコレーターにメソッドを記述

フルネームを呼び出すメソッドを作っていく。

last_name とfirst_nameは、事前にUserモデルのカラムに追加してある。

class UserDecorator < Draper::Decorator
	delegate_all  # UserモデルのメソッドをUserDecoratorクラスでも使用できるようにするための記述
	
	def full_name
		"#{object.last_name} #{object.first_name}"
	end
end

delegate_allは、UserモデルのメソッドをUserDecoratorクラスでも呼び出せるようにするための記述です。この記述をすることで、user.name など、UserモデルのインスタンスメソッドがUserDecoratorクラスでも使用可能になります。

そのことから、上記ではfull_name メソッドで、last_namefirst_name といったメソッドが使えているのです。

ビューファイルでデコレータのメソッドを呼び出す

下記では現在ログインしているユーザー(current_user)をデコレータメソッドを呼び出してフルネームで表示しています。

# メソッドを使いたいViewファイルにて

<%= current_user.decorate.full_name %>

[コラム] helper、moduleとの違い

ではhelperやmoduleとの違いを簡単に触れておきましょう。

helperは主に、モデルとは直接関係のないビューロジックを記述する時に利用します。

Decoratorは特定のモデルに関連したビューロジックを記述する時に利用します。

また、moduleにビューロジックを定義していっても、結局モデルクラスにincludeするのでモデルに直接記載するのとあまり変わりがありません。moduleがビューロジックでモデルがDBに関するロジックでと、自分ルールで使い分けながら開発するなら事足りるかもしれませんが、共同開発の場合はルールを徹底しないと、モデルにビューロジックが溢れ出し、オブジェクト設計の原則から外れてしまうでしょう。

終わりに

デザインパターンやオブジェクト設計の概念が出てきて難しかったですね。今はまだわからないかもしれませんが、Decoratorの使い方を覚えておきましょう。

参考記事

Ruby on Railsのデザインパターンまとめ
Railsアプリケーションの実装が進むにしたがって問題になりやすいのが、Fat ModelやFat Controllerといったコードの肥大化に関する問題です。これは適切にデザインパターンを導入することで防ぐことができます。この記事では、Railsにおけるデザインパターンとはなにか、その必要性やデザインパターンの一覧に...
におけるデザインパターンとは
GitHub - drapergem/draper: Decorators/View-Models for Rails Applications
Decorators/View-Models for Rails Applications. Contribute to drapergem/draper development by creating an account on GitHub.
Decoratorの役割とDraperについて - Qiita
#本記事の内容DecoratorとはなにかDraperとはなにかDecoratorの利便性なぜモデルではだめなのかなぜヘルパーではだめなのかなぜモジュールではだめなのかまとめ#Dec…

コメント

タイトルとURLをコピーしました