はじめに
DBがUTF-8の4バイト以上の文字に対応してなかったので、アプリケーション側で対応します
環境
ruby 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]
=> ["に使用できない文字(🤓)が含まれています。"]
以上です。
それでは〜