RSpec render :newでurlが思ったのと違う
ハマったことのメモ。
RSpecでuserの新規作成あたりのsystemspecを作成していた時の事。
User_Controllerはこんな感じ
def create @user = User.new(user_params) if @user.save redirect_to login_path, notice: 'User was successfully created.' else render :new end
user作成失敗時の挙動のテストで、render :new
だから
期待するurlはnew_user_url
だな〜と思って記入するとあってるはずなのにエラー。
Failure/Error: expect(current_path).to eq new_user_path expected: "/users/new" got: "/users"
どうやらurlが違ったみたい
rails routes
で確認すると
users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy
"/users"はindexじゃない?
と思いつつとりあえず期待するurlをusers_pathとすると成功!!謎!
ここから色々調べた結果こんな質問が↓
https://teratail.com/questions/135588
render 'new'は、newアクションを呼び出しません。表示されるビューだけを切り替えています。
createアクションは/usersなので、これがRailsのデフォルトの動作です。エラーで戻った先を/users/newにしたければ、あえてリダイレクトなどを実装する必要があります。
createアクションのurlが残るからrender時の期待するurlは/usersでいいらしい。
全然気にしてなかったので新しい発見でした。