🙄

Rails 7 で Presenter の導入でハマった

2023/01/18に公開

この書籍に記載のある Presenter の機能を Rails7 で導入しようとしたが、書籍どおりの記述で上手くいかなかったのでメモ。

Ruby on Rails 6 実践ガイド impress top gearシリーズ | 黒田 努 | 工学 | Kindleストア | Amazon

app/presenter/user_presenter.rb

class UserPresenter < ModelPresenter

  delegate :name, :email, to: :object
  delegate :image_tag, to: :view_context

  def gravatar
    gravatar_id = Digest::MD5::hexdigest(email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: name, class: "gravatar")
  end

end

erb側でこう使う。

<% provide(:title, @user.name) %>
<% p = UserPresenter.new(@user, self) %>

<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <h1>
        <%= p.gravatar %>
        <%= @user.name %>
      </h1>
    </section>
  </aside>
</div>

書籍ではこの状態で使えたが、Rails7の場合は別途 auto_load の設定が必要な模様。

app/config/application.rb に以下を追記する。

config.autoload_paths += Dir.glob("#{config.root}/app/presenters")

Discussion