この記事はRuby Advent Calendar 2014 – Qiitaの12/20エントリです。

TL;DR

  • TwitterっぽいURLを作るには、routes.rbscopeを設定する。
Rails.application.routes.draw do
  scope ':name' do
    get '/', controller: :users, action: :show
  end
end
  • このルーティングにすると、ありがちなユーザ名取られた時めんどい
    • index
    • admin
    • blog
  • そこでusername_not_reserved_validatorですよ

TwitterっぽいURL

TwitterのURLは、ドメイン直下にユーザ名がつく。たとえば

http://twitter.com/kwappa

Railsでこういうルーティングにしたいときは、scopeを使うとよい。

Rails.application.routes.draw do
  scope ':name' do
    get '/', controller: :users, action: :show
  end
end

こうすると、users#show:name が渡る。

取られるとまずそうなユーザ名

このようなルーティングにすると、あらゆる単語がユーザ名と解釈されてしまう。scopeはroutes.rbの最後に書いてワイルドカードマッチさせるが、その前の名前付きルートと同じユーザ名を取られるとやばそうだ、というのは容易に想像つくだろう。

たとえば

  • index
  • admin
  • blog

この辺はすでに知見と議論があって、価値のあるドキュメントとしてまとまっている。

Validation するなら username_not_reserved_validator をどうぞ

取られちゃまずいユーザ名なら、ModelでValidationかけてはじきたい。ざっと探した感じそのものずばりのものはなかったので、作ってみた。これが本題。

kwappa/username_not_reserved_validator

class User < ActiveRecord::Base
  validates(:name, username_not_reserved: true)
end

とかすると、リストに含まれたユーザ名でcreateしようとしたら失敗してくれる。

詳細はREADMEを参照していただきたい。

実装はこれをまるっと参考にした。

balexand/email_validator

ということで

めずらしく pebbles ではないgemを作ってみたお話でした。ご意見ご感想Pull-Request、お待ちしております。