[Rails]Decoratorを導入する8/20
はじめに
RailsにDraperを使ってDecoratorを導入していきたいと思います。
環境:
Rails 6.1.7.3
ruby 3.0.0
tl;dr
- Draperとは
- Decoratorを生成する
- Decorateコントローラーを作成する
- Decoratorクラスを作成する
- ビューでデコレーターオブジェクトを使う
- デコレーターとヘルパーメソッドの使いわけ
Draperとは
Draperは、ビューロジックを簡素化し、ビューテンプレートをよりクリーンで保守しやすくするためのGem(ライブラリ)です。Draperは、「デコレーターパターン」と呼ばれるソフトウェアデザインパターンを実装しています。
Draperを使用すると、モデルオブジェクトに関連するビューロジックを分離し、それらを再利用可能なデコレーターオブジェクトとして定義することができます。デコレーターオブジェクトは、モデルオブジェクトをラップして追加のメソッドを提供します。
例えば、User
モデルではユーザーのfirst_name
とlast_name
で保持していますが、Viewではフールネーム”first_name last_name”と表示する場合があります。
この名前のフォーマットを変更するコードは、Model
とView
のどっちに書くのでしょう。
Model
とViewの間にDecoratorを1つ追加して、Decoratorにコードを書くことにしましょう。
Draperの主な利点は次のとおりです:
- ビューロジックの分離: Draperを使用すると、ビューロジックをモデルから分離し、ビューテンプレートをシンプルで読みやすく保つことができます。
- 再利用性の向上: デコレーターオブジェクトは再利用可能で、複数のビューで共有できます。同じビューロジックを複数の場所で再実装する必要がありません。
インストール
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
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 %>
デコレーターとヘルパーメソッドの使いわけ
基本的な違いは、デコレーターはモデルに表示ロジックを提供するのに対し、ヘルパーメソッドはビュ再利用可能なロジックを提供する仕組みです。
デコレーターは特にモデルオブジェクトの表示に焦点を当てており、再利用可能なロジックが必要な場合にはヘルパーメソッドが適しているかもしれません。
最終的な選択は、アプリケーションの設計や要件によって異なるため、具体的なケースに応じて適切な方法を選択する必要があります。
終わりに
デコレーターを使うことでビューロジックをクリーンに保ち、コードの読みやすさを向上させていきたいと思います。
Discussion