draperを使用して、decoratorを導入する
概要
gem draper
を使用して、decorateorを導入し、ロジックを分離させ、可読性を向上させる。
開発環境
- Ruby 2.6.6
- Rails 5.2.5
参考ツール
GPT-4
draperとは?
オブジェクトの機能や振る舞いを拡張するためのジェムです。
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