パスワードリセット機能のバグ修正
エラー内容
①rspec実行時におけるエラー
②リンクからパスワードリセットページへ行き、新しいパスワードを入力して更新を押すが更新できない。
解決手順①
Unable to find field "メールアドレス" that is not disabled
から実際のhtmlのfieldとテストコードのfieldが異なっていることがわかる。
該当のテストコード
fill_in 'メールアドレス', with: user.email
デベロッパーツールでhtmlを調べるとname属性がemailとなっているのでエラーになっている。
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: true
でnilを許可する。
実際のサーバログ
[["reset_password_token", nil]とでている。