DBにデータが登録されない時の対処(エラーが出ない)

f:id:kokorouruou:20210718183118p:plain

私が作成しているアプリケーション「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個ずつ落ち着いて実施出来れば簡単な操作になりますので是非ご活用下さい!