Github みたいにパスの最初のセグメントでユーザー名を使う方法

久々の Rails ネタ。

『root 直下にユーザー名がくるような URL』を設計したいときがたまにある。 例えばこんなやつ。

https://localhost:3000/<ユーザー名>/issues

この URL を実現するには、routes.rb で scope を使って、次のようにルーティングを記述すればいい。

scope "/:username" do
  get "/" => "home#index"
  resources :issues
end

ルーティングを確認してみると

    Prefix Verb   URI Pattern                          Controller#Action
           GET    /:username(.:format)                 home#index
    issues GET    /:username/issues(.:format)          issues#index
           POST   /:username/issues(.:format)          issues#create
 new_issue GET    /:username/issues/new(.:format)      issues#new
edit_issue GET    /:username/issues/:id/edit(.:format) issues#edit
     issue GET    /:username/issues/:id(.:format)      issues#show
           PATCH  /:username/issues/:id(.:format)      issues#update
           PUT    /:username/issues/:id(.:format)      issues#update
           DELETE /:username/issues/:id(.:format)      issues#destroy

期待通り。

ユーザ名はコントローラーの params から取得できる。

class HomeController < ApplicationController
  def index
    @username = params[:username]
  end
end

Rails のルーティングは奥が深いね。