💌

【Rails7.0】Action Mailerのプレビュー時に発生したエラーの解決方法

2023/08/25に公開

概要

Railsチュートリアルの11章を進めていた際、Action Mailerのプレビューコードを実装後に下記のリンクを確認した際に、
http://localhost:3000/rails/mailers/user_mailer/account_activation

Unknown action Mailer preview 'user_mailer/account_activation' not found

というエラーが発生した。

問題

http://localhost:3000/rails/mailers/user_mailer/account_activation
クリックすると…

Unknown action Mailer preview 'user_mailer/account_activation' not found

原因

原因はテストをデフォルトで使用されるminitestではなく、RSpecに変更したこと。
「rails generate mailer コントローラ名 アクション名」を実行した際に、デフォルトでは、test/mailers/previews/コントローラ名_preview.rbファイルが作成されるが、testファイル以下を削除していたせいか、またはRSpecを導入したことで、「spec/mailers/previews/user_mailer_preview.rb」に上記ファイルが作成された。

解決法①

http://localhost:3000/rails/mailers
これらのプレビュー用クラスは、デフォルトでtest/mailers/previewsに配置される。このパスはpreview_pathオプションで設定できる。たとえばlib/mailer_previewsに変更したい場合はconfig/application.rbに以下の設定を追加する。

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"

これを元にすると下記になる

config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"

それを「config/application.rb」に追記しよう

config/application.rb
require_relative "boot"

require "rails/all"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module FlowApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 7.0
    config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"

    # Configuration for the application, engines, and railties goes here.
    #
    # These settings can be overridden in specific environments using the files
    # in config/environments, which are processed later.
    #
    # config.time_zone = "Central Time (US & Canada)"
    # config.eager_load_paths << Rails.root.join("extras")
    config.generators do |g|
      g.test_framework :rspec,
        view_specs: false,
        helper_specs: false,
        routing_specs: false
    end
  end
end

解決法②

user_mailer_preview.rbを「spec/mailers/previews/user_mailer_preview.rb」から「test/mailers/previews/user_mailer_preview.rb」へ移動する

参考

https://railsguides.jp/action_mailer_basics.html#メールのプレビュー
https://qiita.com/Utsubo/items/febc233ee15cdd7a6a77
https://qiita.com/Tatsuya7/items/c78a2f42c048a45cbdc4

まとめ

Railsチュートリアルの11章を進めていた際、Action Mailerのプレビューコードを実装後に下記のリンクを確認した際に、
http://localhost:3000/rails/mailers/user_mailer/account_activation

Unknown action Mailer preview 'user_mailer/account_activation' not found

というエラーが発生した。

原因はテストをデフォルトで使用されるminitestではなく、RSpecに変更したこと。
「rails generate mailer コントローラ名 アクション名」を実行した際に、デフォルトでは、test/mailers/previews/コントローラ名_preview.rbファイルが作成されるが、testファイル以下を削除していたせいか、またはRSpecを導入したことで、「spec/mailers/previews/user_mailer_preview.rb」に上記ファイルが作成された。

解決法は二つ

  • 解決法①:「config/application.rb」に以下の設定を追加する。
  • 解決法②:user_mailer_preview.rbを「spec/mailers/previews/user_mailer_preview.rb」から「test/mailers/previews/user_mailer_preview.rb」へ移動する

Discussion