取られるとまずそうなユーザ名を Validation する username_not_reserved_validator というのを作った
この記事はRuby Advent Calendar 2014 – Qiitaの12/20エントリです。
TL;DR
- TwitterっぽいURLを作るには、
routes.rb
にscope
を設定する。
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を参照していただきたい。
実装はこれをまるっと参考にした。
ということで
めずらしく pebbles ではないgemを作ってみたお話でした。ご意見ご感想Pull-Request、お待ちしております。