Note

3年後の自分のために書いています

Rails で静的なトップページをいい感じにルーティングしたい

例えば静的なトップページを作りたくて GET /welcomewelcome#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 が気になる…!どうやらコントローラ名が単数形だと Railsindex アクションにのみ _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

そもそも全然リソースフルでないルーティングなので最初からこう書けよって話でしたね。勉強になりました。