🦓

[Rails]Decoratorを導入する8/20

2023/06/23に公開

はじめに

RailsにDraperを使ってDecoratorを導入していきたいと思います。

環境:

Rails 6.1.7.3
ruby 3.0.0

tl;dr

  1. Draperとは
  2. Decoratorを生成する
  3. Decorateコントローラーを作成する
  4. Decoratorクラスを作成する
  5. ビューでデコレーターオブジェクトを使う
  6. デコレーターとヘルパーメソッドの使いわけ

Draperとは

Draperは、ビューロジックを簡素化し、ビューテンプレートをよりクリーンで保守しやすくするためのGem(ライブラリ)です。Draperは、「デコレーターパターン」と呼ばれるソフトウェアデザインパターンを実装しています。

Draperを使用すると、モデルオブジェクトに関連するビューロジックを分離し、それらを再利用可能なデコレーターオブジェクトとして定義することができます。デコレーターオブジェクトは、モデルオブジェクトをラップして追加のメソッドを提供します。

例えば、Userモデルではユーザーのfirst_namelast_nameで保持していますが、Viewではフールネーム”first_name last_name”と表示する場合があります。
この名前のフォーマットを変更するコードは、ModelViewのどっちに書くのでしょう。
ModelとViewの間にDecoratorを1つ追加して、Decoratorにコードを書くことにしましょう。

Draperの主な利点は次のとおりです:

  1. ビューロジックの分離: Draperを使用すると、ビューロジックをモデルから分離し、ビューテンプレートをシンプルで読みやすく保つことができます。
  2. 再利用性の向上: デコレーターオブジェクトは再利用可能で、複数のビューで共有できます。同じビューロジックを複数の場所で再実装する必要がありません。

https://github.com/drapergem/draper

インストール

Gemfile
gem 'draper'
bundle install

Decoratorを生成する

bin/rails generate draper:install
create  app/decorators/application_decorator.rb

Decorateコントローラーを作成する

モデルと一緒に作成したい場合

bin/rails generate resource User

モデルが存在しデコレーターのみを作成する場合

bin/rails generate decorator User
create  app/decorators/user_decorator.rb

Decoratorクラスを作成する

ユーザのプロフィール画面にアカウント作成日を表示させます。

app/decorators/user_decorator.rb
# app/decorators/user_decorator.rb
class UserDecorator < Draper::Decorator
  delegate_all

  def formatted_created_at
    created_at.strftime('%Y-%m-%d %H:%M:%S')
  end
end

ビューでデコレーターオブジェクトを使う

<%= Current.user.decorate.formatted_created_at %>

デコレーターとヘルパーメソッドの使いわけ

基本的な違いは、デコレーターはモデルに表示ロジックを提供するのに対し、ヘルパーメソッドはビュ再利用可能なロジックを提供する仕組みです。
デコレーターは特にモデルオブジェクトの表示に焦点を当てており、再利用可能なロジックが必要な場合にはヘルパーメソッドが適しているかもしれません。
最終的な選択は、アプリケーションの設計や要件によって異なるため、具体的なケースに応じて適切な方法を選択する必要があります。
https://qiita.com/jonson29/items/00077b54bb91ed74fdb8

終わりに

デコレーターを使うことでビューロジックをクリーンに保ち、コードの読みやすさを向上させていきたいと思います。

Discussion