scaffold
$ rails g scaffold hoge a:integer b:string c:integer
上記のようなコマンドで基本的なMVCをまとめて作ってくれてありがたいのですが、初心者が故にこれで躓くことがあったので共有します。
controllerにactionを追加するとエラーが発生
上記のコマンドで作成したモデルのcontrollerに独自のアクションを追加したところ、そのアクションにアクセスするところでエラーが出た。
- ルートの宣言を忘れている場合。
- ルートの宣言はしっかりしている場合。
私の場合は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
が複雑になっているとこういう部分を見落としたりするので今回気づけてよかったです。