◼️

draperを使用して、decoratorを導入する

2023/04/10に公開

概要

gem draperを使用して、decorateorを導入し、ロジックを分離させ、可読性を向上させる。

開発環境

  • Ruby 2.6.6
  • Rails 5.2.5

参考ツール

GPT-4

draperとは?

オブジェクトの機能や振る舞いを拡張するためのジェムです。
Draperを使用すると、ビューが持つべきではないロジックをモデルから分離することが可能で、コードの可読性や保守性が向上します。
https://github.com/drapergem/draper

導入手順

draperをインストール

gem 'draper'

Gemfileに追記したら、bundle installします。

Decoratorの生成

次に、モデルに対応するDecoratorを生成します。今回は、Userモデルに対するDecoratorを生成します。

rails generate draper:decorator User

これにより、app/decorators/user_decorator.rbファイルが生成されます。

メソッドの追加

user_decorator.rbファイル内で、ユーザーのフルネームを表示するメソッドを追加します。

class UserDecorator < Draper::Decorator
  delegate_all

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

delegate_allってなんぞ?

デコレータで定義されていないメソッドが呼ばれたときに、それらのメソッドをモデルのインスタンスに委譲する役割があります。
この一文だとわかりにくいので、GPTの例を紹介します。

delegate_allは、デコレータに追加されていない機能が呼び出されたときに、その機能を元のオブジェクトに任せるための指定です。
例えば、友達に電話で質問があるとき、その質問に答えられない場合は、他の友達に質問をまわすようなイメージです。デコレータに追加された新しい機能に対する質問はデコレータが答えるけど、それ以外の質問は元のオブジェクトが答えるという役割分担ができます。

これだと多少イメージできるのではないでしょうか。

Decoratorを呼び出す

下記のようにビューファイルに記載することでDecoratorを呼び出すことができます。

<%= current_user.decorate.full_name %>

おわりに

以上で、Draperを使用してDecoratorを導入する方法について解説しました。このように分離させることで、コードの可読性と保守性が向上するのでぜひ使ってみてください。

Discussion