Ryoの日記

備忘ログ

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でいいらしい。

全然気にしてなかったので新しい発見でした。