例えば静的なトップページを作りたくて GET /welcome
に welcome#hoge(不自然じゃないアクション)
を対応づけたいとする。
Rails っぽくリソースベースな感じで書きたいなと思ったが、単数形リソースを使って以下のようにやってもうまくいかない。
Rails.application.routes.draw do resource :welcome, only: [:show] end
ルーティングを覗いてみると、
$ rails routes Prefix Verb URI Pattern Controller#Action welcome GET /welcome(.:format) welcomes#show
コントローラが複数形の WelcomesController
になってしまう…嫌だ。
Rails ガイドの該当箇所 によると、
単数形リソースは複数形のコントローラに割り当てられます。これは、同じコントローラで単数形のルーティング (/account) と複数形のルーティング (/accounts/45) を両方使いたい場合を想定しているためです。従って、resource :photoとresources :photosのどちらも、単数形ルーティングと複数形ルーティングを両方作成し、同一のコントローラ (PhotosController) に割り当てられます。
とのこと。単数形リソースは Rails が良かれと思って複数形のコントローラに割り当ててくれているんですね。
じゃあ最初から複数形リソースとして扱えばいいのではと思って、
Rails.application.routes.draw do resources :welcome, only: [:index] end
としてみたが、ルーティングを覗いてみると、
$ rails routes Prefix Verb URI Pattern Controller#Action welcome_index GET /welcome(.:format) welcome#index
Prefix の _index
が気になる…!どうやらコントローラ名が単数形だと Rails が index
アクションにのみ _index
を勝手に付与してくれるようだ、おせっかいさん。
結論
はい、普通にこうやりました。
Rails.application.routes.draw do get '/welcome', to: 'welcome#index' end
当たり前ですがルーティングはこうなります。
$ rails routes Prefix Verb URI Pattern Controller#Action welcome GET /welcome(.:format) welcome#index
そもそも全然リソースフルでないルーティングなので最初からこう書けよって話でしたね。勉強になりました。