パスワードリセット機能のバグ修正

エラー内容

rspec実行時におけるエラー
f:id:meo2:20210630234619p:plain ②リンクからパスワードリセットページへ行き、新しいパスワードを入力して更新を押すが更新できない。

解決手順①

Unable to find field "メールアドレス" that is not disabledから実際のhtmlのfieldとテストコードのfieldが異なっていることがわかる。
該当のテストコード
fill_in 'メールアドレス', with: user.email
デベロッパーツールでhtmlを調べるとname属性がemailとなっているのでエラーになっている。 f:id:meo2:20210701013337p:plain

fill_in 'email', with: user.emailとすればテストが通るようになるが、今回はview側を修正する。

form.labelの書き方を修正。

  <% content_for(:title, t('.password')) %>
<h1>パスワードリセット申請</h1>
<%= form_with url: password_resets_path, local: true , method: :post do |form| %>
  <%= form.label :email %><br>
  <%= form.text_field :email, class: 'form-control' %><br>
  <%= form.submit '送信', class: 'btn btn-primary' %>
<% end %>

<%= form.label :email %>から
<%= form.label :email, "メールアドレス" %>へ変更すれば、テストコードを変更しなくてもテストが通るようになる。

解決手順②

②は結論から言うと、userモデルにallow_nil: trueを定義していなかった。

  validates :reset_password_token, uniqueness: true, allow_nil: true

reset_password_tokenはパスワードを変更した際、nilになるので一位制約に引っかかる。
allow_nil: truenilを許可する。
実際のサーバログ
[["reset_password_token", nil]とでている。 f:id:meo2:20210701021147p:plain