LoginSignup
2

More than 5 years have passed since last update.

Railsで改行抜きの文字列長を簡易にvalidateする

Last updated at Posted at 2016-04-21

注意: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(//) } }

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2