UTF-8로 4바이트 이상의 문자를 결정하는 커스텀 밸리데이터 만들기

4601 단어 루비RailsValidation

소개



DB가 UTF-8의 4바이트 이상의 문자를 지원하지 않았기 때문에 응용 프로그램 측에서 지원됩니다

환경



루비 2.5.1
Rails 5.0.6

맞춤 유효성 검사기 만들기



이번, 개별의 속성을 검증하고 싶었으므로, ActiveModel::EachValidator 를 이용합니다.
Active Record 검증 | Rails 가이드
class Lt4bytesValidator < ActiveModel::EachValidator
  # UTF-8で4バイト以上の文字かを判定する
  def validate_each(record, attribute, value)
    return if value.blank?

    unavailable_chars = value.scan(/[^\u0000-\uFFFF]/)

    record.errors.add(attribute, :unavailable, chars: unavailable_chars.uniq.join(', ')) if unavailable_chars.present?
  end
end

locale도 제대로 설정합시다
ja:
  errors:
    messages:
      unavailable: 'に使用できない文字(%{chars})が含まれています。'

모델로 캡처



이번에 만든 Lt4bytesValidator를 사용하려면 lt4bytes 옵션을 전달하면 OK입니다
class Article < ApplicationRecord
  validates :content, lt4bytes: true
  ...

거동 점검



rails console을 사용해보십시오.
article = Article.new
article.content = '🤓'
article.validate
article.errors[:content]
=> ["に使用できない文字(🤓)が含まれています。"]

이상입니다.

그럼 ~

참고


  • UTF-8 - Wikipedia
  • scan (String) - Ruby 참조
  • 좋은 웹페이지 즐겨찾기