ネスト有りのルーティングでテストしようとした
specファイルを書いていたとき、ネスト有りのルーティングのテストでvisitコマンドのパスはどう書くんだと?疑問に思いました。
viewファイルと同じ感じでいけるのか?いう疑問で、試してみるといけました。
routes.rbの設定
routes.rb
ではこのような設定があるとします。
routes.rb
resources :categories do
resources :products
end
rails routes
とすると、こんな感じになります。
結果ログ
category_products GET /categories/:category_id/products(.:format) products#index
POST /categories/:category_id/products(.:format) products#create
new_category_product GET /categories/:category_id/products/new(.:format) products#new
edit_category_product GET /categories/:category_id/products/:id/edit(.:format) products#edit
category_product GET /categories/:category_id/products/:id(.:format) products#show
PATCH /categories/:category_id/products/:id(.:format) products#update
PUT /categories/:category_id/products/:id(.:format) products#update
DELETE /categories/:category_id/products/:id(.:format) products#destroy
visitの失敗例
一番上のpathにアクセスしようとして、やりがちなことですが、そのままパスを書くとエラーになる。
実行例
let!(:category) { FactoryBot.create(:category)
visit category_products_path
結果ログ
ActionController::UrlGenerationError:
No route matches {:action=>"index", :controller=>"products"}, missing required keys: [:category_id]
visitの成功例
viewファイルと同じ感じで、ルーティングパスに変数を渡すと成功します。
root_path
から、ちまちまとclick_link
で移動するのも良いのですが、こういう手もありかなと思います。
実行例
let!(:category) { FactoryBot.create(:category)
visit category_products_path(category)
結果ログ
Finished in 1.05 seconds (files took 2.33 seconds to load)
1 example, 0 failures