JavaScriptを有効にしてください

【Elixir】LiveView でパスワードが消えてしまう現象の解決方法

 ·  ☕ 1 分で読めます

【Elixir】LiveView でパスワードが消えてしまう現象の解決方法

Elixir で LiveView でパスワードが消えてしまう現象がありました。
その解決方法メモ。

環境

  • Elixir 1.14.2
  • Phoenix 1.6.3

現象

以下のような LiveView を使用してログインフォームを作ったところ、パスワード欄に入力した値が消える現象が時折発生。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  <.form
    let={f}
    for={@changeset}
    id="login-form"
    phx-change="validate"
    phx-submit="save">

  <%= label f, :email, "Email" %>
  <%= text_input f, :email %>
  <%= error_tag f, :email %>

  <%= label f, :password, "Password" %>
  <%= password_input f, :password %>
  <%= error_tag f, :password %>

  <div>
    <%= submit "Save", phx_disable_with: "Saving..." %>
  </div>
</.form>

原因

原因は パスワードの入力値は再利用できない とのことです。
これによってフォームのバリデーションチェックが走って changeset が返って来たタイミングで再利用できないため削除されてしまうようです。

対策

changeset の再設定時にパスワードの値を変更しない設定を入れることによって変更されなくなります。
具体的には phx_update: "ignore" を足して上げるだけで解決できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  <.form
    let={f}
    for={@changeset}
    id="login-form"
    phx-change="validate"
    phx-submit="save">

  <%= label f, :email, "Email" %>
  <%= text_input f, :email %>
  <%= error_tag f, :email %>

  <%= label f, :password, "Password" %>
  <%= password_input f, :password, phx_update: "ignore" %>
  <%= error_tag f, :password %>

  <div>
    <%= submit "Save", phx_disable_with: "Saving..." %>
  </div>
</.form>

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer