railsがんばる子

Ruby on Railsがんばる子です。胡蝶蘭のECサイトを運営しています。

routes.rbについてバグ注意

railsでupdateを実装してリリースしたところ、既存機能が動かなくなるバグを出してしまった。

原因はconfig/routes.rbでした。

config/routes.rb

resources :foos, only: [:index, :create, :update]  #<- ここにupdateを足しました。
patch 'foos/bar'

routes.rbを変更したところfoos/barのリクエストがエラーとなってしまいました。

foos/:idのpatchとして解釈され、foos#updateにルーティングされたためです。

config/routes.rb

patch 'foos/bar'
resources :foos, only: [:index, :create, :update]

順番を入れ替えることで解決しました。

railsのルーティングは上から見ていき、見つかった時点でルーティングするためです。

教訓

標準以外のURI(barなど)を作る時はresourcesの前に書きましょう

独自URLは複数リソースにネストしましょう

resources :foos, only: [:index, :create, :update] do
  patch 'foos/bar' on: :collection
end

ネストの一番深い所から展開されていくため、 patch'foos/bar'のルーティングが先に行われます。

各順番だけでの制御だとちょっと不安だし、今回みたいなバグがおきそうなのでネストさせておけば安心ですね。


ルーティングを極める (後編) | TechRacho