Action Text(リッチテキストコンテンツ)に文字数制限をかける際の注意点


はじめに

右も左もわからない未経験エンジニアが書く投稿です。
膨大な勉強量の中で、気になったことや発見などを書いていこうと思います。

今回はRail6より導入されたActionTextでvalidate length: { maximum: }を扱う際の注意点を
メモしようと思います

開発環境

Rails 6.1.3.2
actiontext (6.1.4)

本記事を書くまでの経緯

現在、Railsにてポートフォリオ(Q&Aサイト)の制作をしていて
記事作成・編集時にActionTextを使用しています
(Rails6であれば導入自体はとても簡単なのでおすすめです♪)

ActionTextに文字数制限を掛けたくて

models/article.rb
validates :content, length: { maximum: 20000 }

と設定後、テストしてみると文字数が合わないことに気が付きました

初めて使用する機能で、何がどうなってるんだ?と気になり
原因を探ることになったのでメモします

先に結論

保存されるデータにはHTMLタグなども含まれます

文字数の制限を掛けたりする時は気をつけましょう!

本題

ActiveTextを使用しない場合

「文字数制限かけよう!」となったら

models/article.rb
validates :content, length: { maximum: 100 }

と記述すれば100文字以内で記入することを定められ、DBに登録される際は入力された文字がそのまま保存されます

例) 記事に「こんにちは」と書いた時
content: "こんにちは"
と保存される


ActionTextエディタを使用した場合

action_text_rich_text
というテーブルに保存される事になるのですが、ここで異変が起こります

例)記事にエディタ機能(太文字など)を使わずに「こんにちは」と書いた時
body: #<ActionText::Content "<div class=\"trix-conte...">
と保存される

保存される前に binding.pry で確認すると中身は
<div class=\"trix-content\">\n こんにちは\n</div>\n"
となっています

「こんにちは」に追加で37文字入っている事になります

結果

以上の事からActionTextを使用した際は
100文字書き込んだとしたら、100文字以上になってしまう

もちろん画像を含めたり、エディタ機能を使えば文字数はどんどん増えていきます

この事を頭に入れてからlengthをかけましょう♪

最後に

勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました!