ハマったことのメモ。
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でいいらしい。
全然気にしてなかったので新しい発見でした。