Railsで迷わない! HelperクラスとModuleクラスの使い分け

ruby on rails

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アプリを構築してください!

コメント

タイトルとURLをコピーしました