Rails ビューの整理整頓 プレゼンターの利用

ApplicationHelperモジュールに定義されたメソッドはグローバルに定義される

「app/helpers」ディレクトリ配下に定義されたヘルパーメソッドはアプリケーション全てのERBテンプレートから呼び出し可能なメソッドとして定義される。名前が衝突しないように管理する必要が生じる。ERBテンプレートを整理整頓が目的であれば別の方法も考えられる。
対処方法を以下に挙げます。


  1. モデルクラスのインスタンスメソッドとして定義する

  2. ModelPresenterクラスを定義する


1.モデルクラスのインスタンスメソッドとして定義する

モデルオブジェクトに関連するHTMLコードを生成するメソッドはモデルクラスにまとめられるので、名前が衝突する心配はない。
しかし、ERBテンプレートだけで使用するメソッドをモデルクラスに定義するのはおすすめできない。モデルは本質的な役割は、データの整合性を担保するために正規化やバリデーションを行うことにある。ActiveRecord::Baseクラスを継承したモデル(狭義のモデル)には、さらにデータベースの読み書きという役割もある。よってモデルの責務としては逸脱しているので適切ではない。


2.ModelPresenterクラスを定義する

あるオブジェクトに関連するHTMLコードを生成する役割を担うクラスをプレゼンターと呼ぶ。プレゼンターはコントローラ単位ではなくビューに渡すオブジェクト単位で表示に関するロジックを整理することで、ビューヘルパーの問題点を解決している。ビューに渡していないオブジェクトのメソッドは呼び出せないため、ビューヘルパーのように名前の衝突に注意する必要はない。
プレゼンターを実装したgem:ActiveDecorator

app/presenters/user_presenter.rb

module UserPresenter
  def masked_email
    email.sub(/\A(?,<init>.).+(?<tld>\.[^.]+)\z/, '\k<init>****@****\k<tld>')
  end
end

ビュー

<p>
  <strong>メールアドレス:</strong>
  <%= @user.masked_email %>
</p>

いいなと思ったら応援しよう!