👋

Railsのデザインパターン(Decorator、Serviceとhelper)

2024/02/24に公開

デザインパターンなぜ必要?

Railsにおいて、アプリケーションが大きくなっていくことによって、
設計上に問題が出てきます。コードが複雑化してしまい、開発者の負担が増えて、
開発スピードが遅くなってしまいます。
今回はDecoratorについて説明していきます。

Decorater

ビューヘルパーとして機能するクラスで、Decoratorを使うことで、
ビューでの表示ロジックをモデルから分離し、コードがコードを他の場所や他のプロジェクトで再利用しやすくなり、
変更や修正を加え安かったり、理解しやすくなります。

Decorator導入

  1. Gemにdraperを入れてbundle installします。
gem 'draper'

2.生成されたすべてのデコレーターが継承するApplicationDecoratorを作成します。

rails generate draper:install

3.〇〇モデルに関するデコレータを作成
ここではStaffモデルを作成します。

rails generate decorator Staff

app/decorators/staff_decorator.rbが作成されます。

class StaffDecorator < Draper::Decorator
	delegate_all  # StaffモデルのメソッドをStaffDecoratorクラスでも使用できるようにするための記述
end

⚫︎Decoratorの参考資料

https://osamudaira.com/150/

helperとは(decoraterとの違い)

helperは主に、モデルとは直接関係のないビューロジックを記述する時に使います。
つまりただ表示させるだけの時に使います

Decorator特定のモデルに関連したビューロジックを記述する時に使います。
つまりデータを扱っている時に、そのデータを表示させたい時に使います。

ex)

<tbody>
  <% @reservations.each do |r| %>
    <tr>
      <th><%= r.store.name %></th>
      <td><%= format_datetime(r.start_time) %></td>
      <td><%= status_type(r.status) %></td>
      <td>
       #中略
          <% end %>
        <% end %>
      </td>
    </tr>
  <% end %>
</tbody>
<%= paginate @reservations %>

Service

サービスオブジェクトは、ビジネスロジックをモデルやコントローラから分離するのに使います。
特に、ロジックが複雑でまたは再利用される可能性がある場合に使うといいです。。

ex)

# app/services/user_registration_service.rb
class UserRegistrationService
  def initialize(user_params)
    @user_params = user_params
  end

  def register_user
    # ユーザー登録ロジック
  end
end

資料

https://applis.io/posts/rails-design-patterns#railsのデザインパターン一覧

https://techracho.bpsinc.jp/hachi8833/2021_01_07/14738

Discussion