Railsでは、コードの再利用性を高めるためにHelperクラスとModuleクラスを使用しますが、適切な使い分けが重要です。本記事では、 HelperクラスとModuleクラスの使い分け や違いについて、実践例を通じて理解を深めます。
Helperクラスとは
Helperクラスは、主にView層で共通処理を定義するために使用します。HTMLタグの生成や日付フォーマットなど、表示に関するロジックをまとめて可読性を高めます。
使用例:日付フォーマット
// app/helpers/application_helper.rb
module ApplicationHelper
def format_date(date)
date.strftime("%Y年%m月%d日")
end
end
Viewでの使用例:
<%= format_date(@post.created_at) %>
注意点
Helperクラスは、あくまでViewの表示に関するロジックを記述する場所です。ビジネスロジックを記述すると、MVCの責務が曖昧になるため避けましょう。
Moduleクラスとは
Moduleクラスは、ロジックの共通化やMixinとして利用され、どの階層でも利用できます。複数のモデルやコントローラで共通の処理を行いたい場合に便利です。
使用例:複数モデルで共通の処理
// app/models/concerns/price_calculable.rb
module PriceCalculable
extend ActiveSupport::Concern
def total_price
price * quantity
end
end
// app/models/product.rb
class Product < ApplicationRecord
include PriceCalculable
end
// app/models/order.rb
class Order < ApplicationRecord
include PriceCalculable
end
Modelでの使用例:
product = Product.first
product.total_price
order = Order.first
order.total_price
注意点
Moduleクラスを多用して複数のクラスに混ぜ込むと、コードの依存関係が複雑になり保守性が低下する場合があります。責務を明確にした設計を心がけましょう。
HelperクラスとModuleクラスの違い
- Helperクラス:View専用。ControllerやModelからは呼び出せない。
- Moduleクラス:Controller、Model、Viewのすべてで利用可能。
- 呼び出し方やスコープが異なるため、適材適所で使い分けることが大切。
使い分けの基準
- Helperクラス:View専用の処理(例:日付フォーマット、リンク生成)
- Moduleクラス:複数のモデルやコントローラで共通する処理(例:計算ロジック、API呼び出し)
実践例とベストプラクティス
Helperクラスのベストプラクティス
複雑なHTMLの生成をHelperにまとめることで、Viewの可読性を向上させます。
// app/helpers/application_helper.rb
module ApplicationHelper
def display_status_badge(status)
content_tag(:span, status, class: "badge #{status_class(status)}")
end
private
def status_class(status)
case status
when "active" then "badge-success"
when "inactive" then "badge-secondary"
else "badge-default"
end
end
end
Moduleクラスのベストプラクティス
業務ロジックをModuleにまとめ、複数のModelで利用します。
// app/models/concerns/discountable.rb
module Discountable
extend ActiveSupport::Concern
def apply_discount(rate)
self.price = price * (1 - rate)
end
end
// app/models/product.rb
class Product < ApplicationRecord
include Discountable
end
// app/models/order.rb
class Order < ApplicationRecord
include Discountable
end
まとめ
HelperクラスとModuleクラスの使い分けは、Railsアプリケーションの保守性や可読性に大きく影響します。
- Helperクラス:Viewの表示に特化した処理
- Moduleクラス:共通ロジックの抽出やMixinとしての利用
この違いを理解し、適材適所で使い分けることで、コードの可読性と再利用性を高めましょう。
適切な使い分けを習得して、よりメンテナブルなRailsアプリを構築してください!
コメント