⑤Elixirユーザ認証ライブラリ「phx_gen_auth」の本番向け改造ポイント：コントローラ内／テンプレート内のメッセージのカスタマイズ

[Elixir Digitalization Implementors／fukuoka.ex／kokura.ex](https://fukuokaex.connpass.com/)のpiacereです
ご覧いただいて、ありがとうございます :bow:

[前回](https://qiita.com/piacerex/items/5be752bdb9b18b1e6e6c)に引き続き、Phoenixユーザ認証ライブラリ「phx_gen_auth」のプロダクション向け改造ポイントとして、今回は、コントローラ内／テンプレート内に散らばっているエラー時などのメッセージのカスタマイズについて解説します

<h3>:ocean::ocean: Elixir ranked second on the Qiita Advent calendar :ocean::ocean:</h3>

In the programming language category ranking, Rust was 1st, Elixir was 2nd, Golang was 3rd, and all were modern programming languages.:laughing:
https://qiita.com/advent-calendar/2020/elixir
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/ea185203-c525-c778-dc10-6d2ecc391616.png)](https://qiita.com/advent-calendar/2020/elixir)

In addition, our Elixir community "fukuoka.ex" has won the top spot in the Web Technology category.
https://qiita.com/advent-calendar/2020/fukuokaex
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/8a22a81f-2917-6072-10bd-525e0fc24b75.png)](https://qiita.com/advent-calendar/2020/neosvr_reso)

# 本コラムの検証環境

本コラムは、以下環境で検証しています（Windowsで実施していますが、Linuxやmacでも動作する想定です）

- Windows 11
- Elixir 1.12.0 on WSL2 Ubuntu　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacerex/items/6b64dfe70f48c89d8385)</b>
- Phoenix 1.6.0　　　　　　　　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/b7787580fce5f148242f#phoenix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>
- PostgreSQL 10.17　　　　　　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/a7558adc6856e3577dc6#postgresql%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>

なお、本コラム内で扱うPhoenix PJ名は「basic」、phx_gen_authのコンテキスト名は「Accounts」を前提にしています

# ⑤メッセージのカスタマイズ

## ④－１：コントローラ内のメッセージ

対象ファイルは、以下の通りです

| ファイルパス |  |
| - | - |
|lib/basic_web/controllers/account_auth.ex | 未ログイン時のメッセージを定義 |
|lib/basic_web/controllers/account_confirmation_controller.ex | ユーザ仮登録後の本登録に関するメッセージを定義 |
|lib/basic_web/controllers/account_registration_controller.ex | ユーザ登録時のメッセージを定義 |
|lib/basic_web/controllers/account_reset_password_controller.ex | パスワードリマインダに関するメッセージを定義 |
|lib/basic_web/controllers/account_session_controller.ex | ログインに関するメッセージを定義 |
|lib/basic_web/controllers/account_settings_controller.ex | メールアドレス／パスワード変更に関するメッセージを定義 |

たとえば、未ログイン時のエラーメッセージを変更する場合は、下記のようにメッセージ変更します

```elixir:lib/basic_web/controllers/account_auth.ex
…
  def require_authenticated_account(conn, _opts) do
    if conn.assigns[:current_account] do
      conn
    else
      conn
#      |> put_flash(:error, "You must log in to access this page.")  # <-- comment-out here
      |> put_flash(:error, "本ページにアクセスする際は、ログインを行ってください" )  # <-- add here
      |> maybe_store_return_to()
      |> redirect(to: Routes.account_session_path(conn, :new))
      |> halt()
    end
  end
…
```

他ファイルのメッセージを変更する場合も、put_flash()内の文字列を更新してください

## ④－２：テンプレート内のメッセージ

対象ファイルは、以下の通りです

| ファイルパス | 役割|
| - | - |
| lib/basic_web/templates/account_registration/new.html.heex | ユーザ登録時エラーメッセージを定義 |
| lib/basic_web/templates/account_reset_password/edit.html.heex | パスワードリマインダのパスワードリセット時エラーメッセージを定義 |
| lib/basic_web/templates/account_session/new.html.heex | ログイン時エラーメッセージを定義 |
| lib/basic_web/templates/account_settings/edit.html.heex | メールアドレス／パスワード変更時エラーメッセージを定義 |

たとえば、ユーザ登録時エラーメッセージを変更する場合は、下記のようにメッセージ変更します

```elixir:lib/basic_web/templates/account_confirmation/new.html.heex
<h1>Register</h1>

<.form let={f} for={@changeset} action={Routes.account_registration_path(@conn, :create)}>
  <%= if @changeset.action do %>
    <div class="alert alert-danger">
      <!--<p>Oops, something went wrong! Please check the errors below.</p>-->
      <p>ユーザ登録時にエラーが発生しました</p>
    </div>
  <% end %>
…
```

他ファイルのメッセージを変更する場合も、``<div class="alert alert-danger">`` 配下の文字列を更新してください

# 最後に

今回は、「phx_gen_auth」のプロダクション向け改造ポイントのうち、コントローラ内／テンプレート内に散らばっているエラー時などのメッセージのカスタマイズを行いました

第1回で変更したバリデーションメッセージだけで無く、各ページ全体のエラーメッセージ等は、今回の対応が必要となるため、プロダクション時は見逃さないよう、注意ください

次回は最終回、ユーザ仮登録を有効にします