新規登録失敗後の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となる。