gensym

プログラミングと読書、勉強に関するメモ

ルーティングで文字列をモデルのパスに使用する[Rails]

rails で resources を使うと自動でパスと関連したメソッドが作られる。
例えば name 要素を持つ User モデルを作ったとして、

# config/routes.rb
...
  resources :users
...

のようにすると、id が 1 の User のパスは、
www.example.com/users/1
のようになる。
これは分かりやすくて良いのだけれど、少々不格好でスクレイピングのコントロールもしにくい。
理想としては
www.example.com/example_user
のように、モデル名を無くして、ユーザ名でアクセス出来るようにしたい。
有名どころだと TwitterGithub はこのようにしているようだ。

まずは routes.rb を書き換える。

# config/routes.rb
...
  get '/:id', to: 'users#show'
...

デフォルトの id は整数なので、to_param メソッドをオーバーライドして name を使うようにする。

# app/model/user.rb
...
  def to_param
    name
  end
...

user_path メソッドもオーバーライドする。

# app/helper/application_helper.rb
...
  def user_path(user)
    "/#{user.name}"
  end
...

test を使うときは test_helper でもオーバーライドする必要があるだろう。
とりあえず show だけだが、edit や destroy も同様に出来る。
文字列をパスに使う場合は一意性が必要になるので、インデックスは必須だ。
また、デフォルトの id を使う場合に比べて検索のパフォーマンスも低下するだろう。