はじめに
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_name
やfirst_name
といったメソッドが使えているのです。
ビューファイルでデコレータのメソッドを呼び出す
下記では現在ログインしているユーザー(current_user)をデコレータメソッドを呼び出してフルネームで表示しています。
# メソッドを使いたいViewファイルにて
<%= current_user.decorate.full_name %>
[コラム] helper、moduleとの違い
ではhelperやmoduleとの違いを簡単に触れておきましょう。
helperは主に、モデルとは直接関係のないビューロジックを記述する時に利用します。
Decoratorは特定のモデルに関連したビューロジックを記述する時に利用します。
また、moduleにビューロジックを定義していっても、結局モデルクラスにincludeするのでモデルに直接記載するのとあまり変わりがありません。moduleがビューロジックでモデルがDBに関するロジックでと、自分ルールで使い分けながら開発するなら事足りるかもしれませんが、共同開発の場合はルールを徹底しないと、モデルにビューロジックが溢れ出し、オブジェクト設計の原則から外れてしまうでしょう。
終わりに
デザインパターンやオブジェクト設計の概念が出てきて難しかったですね。今はまだわからないかもしれませんが、Decoratorの使い方を覚えておきましょう。
参考記事

コメント