4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】summernote 本番環境で画像保存ができない時の解決方法

Posted at

はじめに

某スクールの学習過程ポートフォリオ作成の際に、**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型を使うという程度の知識でした。

###②変更すべき点
上記内容で、「データが長すぎて保存できない」という問題点がわかりました。
そうしたら収まるように大容量用のデータ型に変更
してあげればいいだけです!
下記記述が修正を加えたマイグレーションファイルになります。

(date)_change_column_to_article.rb
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

すると、以下の内容でマイグレーションファイルが作成されます。

日付_change_column_to_Article.rb
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
  def change
  end

そして、変更前の記載と変更後の記載を加えます。
ここの記述は冒頭に記載したものと同じになります。

日付_change_column_to_article.rb
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文字を超える文字列は扱えません。単純なことでこれが開発環境と本番環境での違いによるエラーの発生の理由でした。(現在の知識・語彙力ではこれが限界です。いずれもっと詳しく解説を加えられたらと思います!)

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?