質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

1717閲覧

[Rails]画像を保存できない Mysql2::Error: Field 'image' doesn't have a default value

naota7118

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/08/01 21:27

編集2020/08/16 11:10

転職活動用の個人アプリを作成中で、画像保存ができずに困っています。
食べたものやその食べ物のカロリー値を投稿して体重管理するアプリを作成中です。
よろしくお願いします。

前提・実現したいこと

画像を投稿できるようにしたい。
複数枚投稿できるように、postモデルの子モデルimageモデルに画像を保存できるようにしたい。

発生している問題・エラーメッセージ

ActiveRecord::NotNullViolation (Mysql2::Error: Field 'image' doesn't have a default value: INSERT INTO `images` (`post_id`, `created_at`, `updated_at`) VALUES (153, '2020-08-01 20:38:48', '2020-08-01 20:38:48')):

MySQLのimagesテーブルにimageカラムがないよというエラーなのかなと思いますが、MySQLのimagesテーブルにはimageカラムはちゃんとあるので、なぜこのようなエラーが出てしまうのかがわかりません。
イメージ説明

該当のソースコード

posts_controller

ruby

1 def index 2 @posts = Post.all.includes(:user).order("created_at DESC").page(params[:page]).per(5) 3 @post = Post.new 4 @post.images.build 5 end 6 7 def create 8 binding.pry 9 @post = Post.new(post_params) 10 if @post.save 11 redirect_back(fallback_location: root_path) 12 else 13 @posts = Post.includes(:user) 14 flash.now[:alert] = '必須項目をしてください。' 15 redirect_back(fallback_location: root_path) 16 end 17 binding.pry 18 end 19 20private 21 def post_params 22 params.require(:post).permit(:food, :calorie, :protein, :fat, :carbo, :text, images_attributes: [:image]).merge(user_id: current_user.id) 23 end
post.rb

ruby

1belongs_to :user 2has_many :images, dependent: :destroy 3accepts_nested_attributes_for :images
image.rb

ruby

1belongs_to :post 2mount_uploader :image, ImageUploader

試したこと

images_attributes: [:image]images_attributes: {image: []}に変更してみた。その結果、no implicit conversion of nil into Stringというエラーが出て、image.rbmount_uploader :image, ImageUploadermount_uploaders :image, ImageUploaderと複数形にしたらエラーは解決したが、下のMySQLの画像のように、MySQLに["profile-image1.png"]と配列の形で保存されてしまった。正規表現でprofile-image1.pngだけ表示しようとしたがうまくいかなかった。

ruby

1private 2 def post_params 3 params.require(:post).permit(:food, :calorie, :protein, :fat, :carbo, :text, images_attributes: {image: []}).merge(user_id: current_user.id) 4 end

イメージ説明

binding.pryparamspost_paramsの中身を確認した。その結果、paramsには画像データが入っているが、post_paramsには画像データが入っていないことがわかった(間違っていたらすみません)。

paramsの中身
pry(#<PostsController>)> params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"Uy5a+gfF1fZhXo/+cuGE/eiOrCfQXEtD9ByfBsg6CAtnYFRQDZnOiEIYn28OU2ngoAKSnyvWcFLPJygfKOY7mQ==", "post"=>{"food"=>"うどん", "calorie"=>"100", "protein"=>"100", "fat"=>"100", "carbo"=>"100", "text"=>"うどん", "images_attributes"=>{"0"=>{"image"=>[#<ActionDispatch::Http::UploadedFile:0x00007fea9834c9b8 @tempfile=#<Tempfile:/var/folders/sy/26p55v5j47s2zjd8h7vr8f6h0000gn/T/RackMultipart20200802-70226-1nfrywj.png>, @original_filename="profile-image1.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"post[images_attributes][0][image][]\"; filename=\"profile-image1.png\"\r\nContent-Type: image/png\r\n">]}}}, "commit"=>"投稿する", "controller"=>"posts", "action"=>"create"} permitted: false>
post_paramsの中身
pry(#<PostsController>)> post_params Unpermitted parameter: :image => <ActionController::Parameters {"food"=>"うどん", "calorie"=>"100", "protein"=>"100", "fat"=>"100", "carbo"=>"100", "text"=>"うどん", "images_attributes"=><ActionController::Parameters {"0"=><ActionController::Parameters {} permitted: true>} permitted: true>, "user_id"=>3} permitted: true>

補足情報(FW/ツールのバージョンなど)

Ruby 2.5.1
Rails 5.2.4.3

追記

imageカラムのnull制約を解除しnullを許可したことで、「Mysql2::Error: Field 'image' doesn't have a default value」というエラー文は表示されなくなった代わりに、「imageカラムがnullになってしまう」という別の問題が発生しました(問題自体は変わっていないのですが)。
イメージ説明

問題が変わったため、新たに別の質問を立ち上げさせていただきました。
https://teratail.com/questions/285118
今後はこちらではなく、新たに立ち上げたページでやりとりさせていただければ幸いです。

ご回答くださったsaoyagi2さん、winterboumさん、ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

images テーブルに image カラムが無いのではなく、INSERT 文で image カラムが指定されていないためにエラーになっています。指定されているカラムは post_id, created_at, updated_at の三つだけですね。

sql

1INSERT INTO `images` (`post_id`, `created_at`, `updated_at`) VALUES (153, '2020-08-01 20:38:48', '2020-08-01 20:38:48')):

image カラムに DEFAULT 値が設定されていない場合、INSERT 文で省略することができません。

投稿2020/08/02 11:29

saoyagi2

総合スコア210

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2020/08/02 12:04

結果として INSERTにimageが渡らなかったのでエラーというのは合っていると思いますが、問題は images_attributes: [:image] でimageがなぜ渡らないのか、にあると思います。
naota7118

2020/08/02 21:49

saoyagi2さん ご回答ありがとうございます!INSERT 文で省略可能な書き方と省略不可の書き方があることを知らなかったので勉強になりました。今回INSERT文は自分で入力したわけではなく、投稿すると自動で作動し、なぜimageカラムだけ指定されてくれないのかがまだわかっておりません。image カラムに DEFAULT 値が設定すればいい?とも思いましたが、imageなしでもOKにしたいので、それだとDEFAULT 値は設定しない方がいいのかなと思いました。
naota7118

2020/08/02 21:50

winterboumさん コメントありがとうございます! >問題はimages_attributes: [:image]でimageがなぜ渡らないのか おっしゃる通りまさにその部分でつまずいております????
winterboum

2020/08/02 23:02

image が モデルとcoliumnと両方にあるので混乱しそう。 「imageなしでもOK」のimageはcolumnのことですか?でしたら null: true にするか defaultが必要です。 でも post.images が空でもよいということでしたらそこは無関係。
naota7118

2020/08/03 21:28 編集

winterboumさん >「imageなしでもOK」のimageはcolumnのことですか?でしたら null: true にするか defaultが必要です。 わかりにくい説明で失礼いたしました。投稿する項目は、摂取カロリー値、タンパク質、脂質、炭水化物(これら全てinteger型)、文章(text型)、画像(string型)なのですが、このうち文章と画像はなしでも投稿できるような実装をしたいと思っています。imageテーブルのimageカラムにnull制約をかけていたので、nullを許可しました。ありがとうございます。
winterboum

2020/08/03 23:05

なんか違う気がするが、、、、
naota7118

2020/08/16 11:04

winterboumさん 回答頂いたにもかかわらず返信しない状態が続き、大変失礼なことをしてしまいました。申し訳ございませんでした。nullを許可したところでこの解決には関係ないのですが、画像がなくてもエラーとならず画像以外のデータは問題なく表示されて欲しかったので、nullを許可しました。当然ながら今度はimageカラムがnullになってしまう問題に直面しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問