49hack

見習いエンジニアが魔法使いになるまで

4byte文字(絵文字や一部の漢字)が含まれているかどうかチェックする

本当はmysql側のエンコーディング変更すべきですが、アプリケーション側の応急処置として。

class Post < ActiveRecord::Base
    validate :no_4_bytes

    # 本文に4byte文字を使わないように
    def no_4_bytes
        if content.present?
            chars = content.each_char.select{|c| c.bytes.count >= 4}
            if chars.size > 0
                errors.add(:content, "に絵文字(#{chars.join('')})は使用できません。")
            end
        end
    end
end

文字列をeach_charで回して、バイト数が4以上ある文字を検出しています。
シンプルですが、文字量多い場合は大変。。

参考