注意:Rails5.2でlength validationのtokenizerオプションが削除されたためtokenizerを利用した方法は利用できません。別途改行コードを除くようにしましょう。
@MasamotoMiyata さん、ご指摘ありがとうございました。
整形のための改行で入力文字数に数えたくないといった仕様のときvalidateのmethodに書いたりすると思いますが、もう少し簡易に行いたいとき以下のように書いたりすると思います。
validate :validate_title_length
def validate_title_length
if title.gsub(/[\r\n]/, '').length > 50
errors.add(:title, :too_long)
end
end
本来の用途は違うがtokenizerのオプションを使うと少し簡単に書ける
:tokenizer - Specifies how to split up the attribute string. (e.g. tokenizer: ->(str) { str.scan(/\w+/) } to count words as in above example). Defaults to ->(value) { value.split(//) } which counts individual characters.
def validates_length_of(*attrs)
# Merge given options with defaults.
options = {
:tokenizer => lambda {|value| value.split(//)}
}.merge(DEFAULT_VALIDATION_OPTIONS)
...
通常は一文字ずつ配列にして長さを求めているのが、改行コードを除いてしまえばカウントされない。tokenizerの使い方としてはちょっと違うが特定の文字を除外してカウントしたいときには使ってもいいかもしれない。
validates :title, length: { maximum: 50, tokenizer: ->(str) { str.gsub(/[\r\n]/, '').split(//) } }