before_validation
で入力を整えるのがいいのかな。
class Post < ActiveRecord::Base
# when Post has body:text
before_validation :body do
self.body = body.gsub(/\r\n/, "\n")
end
validates_length_of :body, maximum: 100
end
これで "foo\r\nbar" という文字列が送信されても "foo\nbar" になおしてからvalidateするので見た目どおりに動く。
さて、これはテストすべきだろうか。別にこれはRailsの実装がまずいわけではないがハマりどころではある。特にクライアント側でリアルタイムにユーザに残りの入力可能文字数を見せている場合は対応すべきだ。そうでない場合は別の方法で解決するほうがいいこともある(たとえば validates_length_of
の custom tokenizer を使う方法など)。わかってしまえば自明なことで常にテストすべきとも思わないが、プロジェクトをgrepして探し出せるほうがいいからモデル1つ分くらいはきっちりテストを書いておくのがよいのかなと思う。
cf. テスト書きすぎ問題