Ruby
Rails
初心者
Webアプリケーション

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

scaffold

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

のようにすると基本的なMVCをまとめて作ってくれてありがたいのだが、初心者がゆえにこれでつまづくことがあったので共有。

controllerにactionを追加してもエラーが出る。

上記のコマンドで作成したモデルのcontrollerに独自のアクションを追加したところ、そのアクションにアクセスするところでエラーが出る。
1. ルートの宣言を忘れている場合。
2. ルートの宣言はしっかりしている場合。
の二つに分かれると思われるが、つまずく場合は2の方。
scaffoldで作成すると、 以下のようになっている。

route.rb
resources :hoge

resourcesで色々なルートを定義してくれている。
例えば、この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が複雑になっているとこういう部分を見落としたりするので今回気づけてよかったです。