rails scaffoldで作成したcontrollerに独自のactionを追加する場合の注意


scaffold

$ rails g scaffold hoge a:integer b:string c:integer

上記のようなコマンドで基本的なMVCをまとめて作ってくれてありがたいのですが、初心者が故にこれで躓くことがあったので共有します。

controllerにactionを追加するとエラーが発生

上記のコマンドで作成したモデルのcontrollerに独自のアクションを追加したところ、そのアクションにアクセスするところでエラーが出た。

  1. ルートの宣言を忘れている場合。
  2. ルートの宣言はしっかりしている場合。

私の場合は2のパターンだったため混乱しました。
scaffoldで作成すると、 以下のようにresources:でルートが定義されます。

route.rb
resources :hoge

このhogeモデルにdetailというアクションを自分で追加した場合に私は思考停止で適当に以下のように書いていました。

route.rb
resources :hoge
get 'hoge/detail'

そしてブラウザからアクセスすると、以下のようなエラーが発生し頭を抱えます。

ActiveRecord::RecordNotFound in MessagesController#show
Couldn't find Message with 'id'=detail

これが解決できなかったので(ググっても躓いている人すらいない笑)デフォルトのアクションを改造したりして逃げていたのですが、なんとか解決しました。
route.rb
get 'hoge/detail'
resources :hoge

独自のアクションはresourceより上に書かないといけないらしいです。これだけ。

あとがき

普通なら躓くところではないかもしれませんが、 route.rbが複雑になっているとこういう部分を見落としたりするので今回気づけてよかったです。