8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-30

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が複雑になっているとこういう部分を見落としたりするので今回気づけてよかったです。

8
3
2

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
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?