LoginSignup
3
2

More than 3 years have passed since last update.

Rspecでネスト有りのルーティングパスにvisitコマンドでアクセスする for Ruby on Rails

Last updated at Posted at 2020-03-17

ネスト有りのルーティングでテストしようとした

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
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2