新規登録失敗後のURLが/userのわけ

●new_user_registration_pathでなく、
 user_registration_pathになる理由。

・解決したいこと

新規登録に失敗したら、登録ページに戻されることを
確認する記述について。

#spec/system/users_spec.rb
# 新規登録ページへ戻されることを確認する
    expect(current_path).to eq(user_registration_path)
    binding.pry

deviseのregistrationコントローラーのルーティングは、下記の通り。

#rails routes実行結果から抜粋
Prefix Verb                                   URI Pattern              Controller#Action
cancel_user_registration GET  /users/cancel(.:format)   devise/registrations#cancel
new_user_registration GET     /users/sign_up(.:format)   devise/registrations#new
edit_user_registration GET   /users/edit(.:format)             devise/registrations#edit
user_registration PATCH      /users(.:format)           devise/registrations#update
                  PUT        /users(.:format)           devise/registrations#update
                  DELETE     /users(.:format)           devise/registrations#destroy
                  POST       /users(.:format)           devise/registrations#create

registrations#newでのレスポンスとなる、新規登録ページのパスは、
new_user_registration_pathである。

なぜ、eqマッチャの引数がuser_registration_pathになるのか。

・調べた内容、仮説

binding.pryで止めてページを確認。
表示されたページは、「エラーメッセージが表示されている」登録ページ。また、コンソールにてcurrent_pathを実行した結果は「/user」

/usersに対応するコントローラーアクションは、updateかdestroyかcreate。
今回は、フォームの送信によるリクエストの結果のため、
createアクションが動いている。

そこから考えると、
登録できればトップページにリダイレクト、
登録できなければ「エラーメッセージが表示されている」新規登録ページを表示、
という分岐になっているのだろうと予測する。

つまり、createアクション実行後、新規登録ができなければ
本来の新規登録ページではなく
エラーメッセージの入った新規登録ページを表示しているので
それが表示されるパスが/userということか。

・質問で深まった理解

これはrenderが原因。
renderを使用することで、
createアクションのパスのまま、新規登録ページが表示される。

通常なら、コントローラーを通過してからビューが表示される。
だがrenderの場合、コントローラーをスルーしてビューだけ読み込む。

つまり、createアクションの/userというパスのまま
むりくり読んできた新規登録ページが表示されるため

current_pathは、/users/sign_upではなく、/userとなる。