転職活動用の個人アプリを作成中で、画像保存ができずに困っています。
食べたものやその食べ物のカロリー値を投稿して体重管理するアプリを作成中です。
よろしくお願いします。
前提・実現したいこと
画像を投稿できるようにしたい。
複数枚投稿できるように、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.rb
のmount_uploader :image, ImageUploader
をmount_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.pry
でparams
とpost_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さん、ありがとうございました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 12:04
2020/08/02 21:49
2020/08/02 21:50
2020/08/02 23:02
2020/08/03 21:28 編集
2020/08/03 23:05
2020/08/16 11:04