DBにデータが登録されない時の対処(エラーが出ない)
私が作成しているアプリケーション「Yamashiru」を受けて気になった点や復習した方が今後の役に立つと思って作成しています。
さらにエンジニア初心者の方に向けて タメになる情報をお届けします。
今回は、、、
DBにデータが登録されない時の対処
今回のケースは今まで画像投稿が出来ていたのに突然DBに保存できなくなってしまった時の対処方法についてまとめました。
問題点を確認
エラーが出ない場合はbinding.pryを活用します。今回のポイントは「tweetで保存(create)しようとしたが出来なかった」です。
Gemfile
gem 'pry-rails'
tweets_controller.rb
def create binding.pry #ここに入れます @tweet = Tweet.new(tweet_params) if @tweet.save redirect_to root_path else render :new end end
ターミナル
13: def create => 14: binding.pry 15: @tweet = Tweet.new(tweet_params) 16: if @tweet.save 17: redirect_to root_path 18: else 19: render :new 20: end 21: end [1] pry(#<TweetsController>)> params => <ActionController::Parameters {"authenticity_token"=>"nHTZ+u5/93ovBjChsu26SBv8hlSqSGJBRBzMzKoscajUOaCI2sikOtszQsGqjSnI0mU4AN2+DDEiJQ+1G9ca2g==", "tweet"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00007f8487626c78 @tempfile=#<Tempfile:/var/folders/z5/hwd0zxps2ld2xpsfx_6bjb6c0000gn/T/RackMultipart20210729-2283-1c34iv8.jpg>, @original_filename="pexels-dziana-hasanbekava-5589435.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"tweet[image]\"; filename=\"pexels-dziana-hasanbekava-5589435.jpg\"\r\nContent-Type: image/jpeg\r\n">, "title"=>"大パノラマ", "theme_id"=>"4", "prefecture_id"=>"6", "mountain_name_id"=>"4", "climbing_time_id"=>"5", "stamina_id"=>"4", "mountain_view_id"=>"3", "danger_id"=>"2"}, "commit"=>"SEND", "controller"=>"tweets", "action"=>"create"} permitted: false> [2] pry(#<TweetsController>)> tweet_params User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/tweets_controller.rb:34:in `tweet_params' => <ActionController::Parameters {"image"=>#<ActionDispatch::Http::UploadedFile:0x00007f8487626c78 @tempfile=#<Tempfile:/var/folders/z5/hwd0zxps2ld2xpsfx_6bjb6c0000gn/T/RackMultipart20210729-2283-1c34iv8.jpg>, @original_filename="pexels-dziana-hasanbekava-5589435.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"tweet[image]\"; filename=\"pexels-dziana-hasanbekava-5589435.jpg\"\r\nContent-Type: image/jpeg\r\n">, "title"=>"大パノラマ", "theme_id"=>"4", "prefecture_id"=>"6", "mountain_name_id"=>"4", "climbing_time_id"=>"5", "mountain_view_id"=>"3", "stamina_id"=>"4", "danger_id"=>"2", "user_id"=>2} permitted: true>
ターミナル
[1] pry(#<TweetsController>)> @tweet.image => #<ActiveStorage::Attached::One:0x00007f8483e83aa0 @name="image", @record= #<Tweet:0x00007f848780cd58 id: nil, title: "テスト", theme_id: 4, prefecture_id: 6, climbing_time_id: 5, mountain_view_id: 3, stamina_id: 4, danger_id: 2, user_id: 2, category_id: nil, #不要なidが含まれていてnilになっている created_at: nil, updated_at: nil, mountain_name_id: 4>>
問題点の対処
別機能を付ける際に後にアソシエーションでcategoryを追加したことによる原因ということが判明しました。では先程のnilはどのように解消すれば宜しいでしょうか。
model/tweet.rb
<中略> belongs_to :category, optional: true #optional: true を追加
optional: trueは、belongs_toの外部キーのnilを許可するというものであり こちらでデータ登録が出来る様になりました。
いかがでしたでしょうか? 1個ずつ落ち着いて実施出来れば簡単な操作になりますので是非ご活用下さい!