はじめに
某スクールの学習過程ポートフォリオ作成の際に、**Gem 'summernote'**を用いて
リッチテキストエディタを実装しました。
開発環境上では画像を含めたテキストの投稿が可能でしたが、
デプロイ後の本番環境にて画像を投稿しようとすると下記エラーが発生し、投稿保存がされませんでした。
(0.5ms) ROLLBACK
Completed 500 Internal Server Error in 46ms (ActiveRecord: 12.9ms)
ActiveRecord::ValueTooLong (Mysql2::Error: Data too long for column 'article_content' at row 1:
INSERT INTO `articles` (`admin_id`, `article_title`, `article_content`, `article_image_id`, `created_at`, `updated_at`) VALUES (1, '観葉植物の置き場所はどこがいいか', '<p><img src=\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QB+RXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAABJADAAIAAAAUAAAAUJKGAAcAAAASAAAAZKACAAQAAAABAAA...(以下長すぎるので省略します)
##解決方法
【前提】
・テーブル名はArticleとしてます。(Article=記事の意)。この部分は任意の名前にしてください。
###①エラー文の解釈
まず、ターミナルに表示されていたActiveRecord::ValueTooLong (Mysql2::Error: Data too long for column...)このエラー文が解決への糸口になります。
簡潔にいうと、「データが長すぎ」と言われています。
投稿文を保存するarticle_contentのデータ型をtextにしていましたが、これでもまだ足りないと言われているわけです。
代表的なデータ型として短文(1〜255文字)はstring型、長文()はtext型を使うという程度の知識でした。
###②変更すべき点
上記内容で、「データが長すぎて保存できない」という問題点がわかりました。
そうしたら収まるように大容量用のデータ型に変更してあげればいいだけです!
下記記述が修正を加えたマイグレーションファイルになります。
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
def up
change_column :articles, :article_content, :text, null: false, limit: 4294967295
end
def down
change_column :articles, :article_content, :text, null: false
end
end
※以下、修正内容についての詳細です。
デプロイの際にMySQL
MySQLにあるデータ型は以下の通りです。
データ型 | 解説 |
---|---|
CHAR | 255Bまでの固定長文字列 |
VARCHAR | 64KBまでの可変長文字列 |
TINYTE | 255Bまでの可変長文字列 |
TEXT | 64KBまでの可変長文字列 |
MEDIUMTEXT | 1.6MBまでの可変長文字列 |
LONGTEX | 4.3GBまでの可変長文字列 |
この中のLONGTEXTを使用する事にしました。(最大にしておけば足りなくなることはまずないだろうという考え)
ただし前述した通り、Railsの学習をした際にstringとtextくらいしか学習した記憶がなかったため設定方法がわかりませんでした。
調べた結果、結構簡単でリミットをつけるだけでした。
まずカラムに変更を加えるため、以下のようにします。
$ rails g migration ChangeColumnToArticle
すると、以下の内容でマイグレーションファイルが作成されます。
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
def change
end
そして、変更前の記載と変更後の記載を加えます。
ここの記述は冒頭に記載したものと同じになります。
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
※変更を加えた記述
def up
change_column :articles, :article_content, :text, null: false, limit: 4294967295
end
※変更前の記述
def down
change_column :articles, :article_content, :text, null: false
end
end
リミットを書き加えることで、LONGTEXT型にします。
なお、4294967295と言う数字は4294967295バイト(4.3GB)でLONGTEXT型の上限です。
limitの範囲を16777216 ~ 4294967285にするとLONGTEXT型になるそうです。
$ rails db:migrate
変更を反映させて終了です。
##そもそも、なぜ開発環境では使えて、本番環境でエラーが出たのか
本番環境ではMySQLを使用していて、MySQLのtext型には最大長が設定されており、半角で65,535文字を超える文字列は扱えません。単純なことでこれが開発環境と本番環境での違いによるエラーの発生の理由でした。(現在の知識・語彙力ではこれが限界です。いずれもっと詳しく解説を加えられたらと思います!)