👋
Railsのデザインパターン(Decorator、Serviceとhelper)
デザインパターンなぜ必要?
Railsにおいて、アプリケーションが大きくなっていくことによって、
設計上に問題が出てきます。コードが複雑化してしまい、開発者の負担が増えて、
開発スピードが遅くなってしまいます。
今回はDecoratorについて説明していきます。
Decorater
ビューヘルパーとして機能するクラスで、Decoratorを使うことで、
ビューでの表示ロジックをモデルから分離し、コードがコードを他の場所や他のプロジェクトで再利用しやすくなり、
変更や修正を加え安かったり、理解しやすくなります。
Decorator導入
- 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の参考資料
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
資料
Discussion