LoginSignup
0
0

[初投稿]投稿を削除しようとしたらmodelのbelongs_to :user,dependent: :destroyが原因でできなかった話

Last updated at Posted at 2023-12-11

前提

  • Rails7
  • ローカル環境

何のために?

レシピを投稿するアプリを削除するリンクを作ったら削除されずエラー画面もでなかった件。またあるだろうから自己対応用に

エラーが起きたときの状況

レシピの詳細画面からレシピを削除できるようにリンクを貼っていた。

show.html.erb
<% if user_signed_in? %>
  <% if @recipe.user_id == current_user.id %>
    <%= link_to 'レシピを削除する',recipe_path(@recipe.id), data: { turbo_method: :delete, turbo_confirm: " 本当に削除しますか?" }/ %>
#ログイン状態かつ自分の投稿である場合、確認をとって削除する。
  <% end %>
<% end %>

本来なら、削除が成功して投稿一覧画面なりに飛ぶはずが削除されずエラー画面も出ない。これは困った。

ログを見てみよう

スクリーンショット 2023-12-04 7.30.11のコピー.png

※本来ならこの下にロールバックが出ているログなのですがスクショを撮り忘れていましたorz
以下は幸いにもコピーしていた削除時のログです。

Started GET "/uploads/recipe/photo/3/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2021-11-03_20.54.31.png" for ::1 at 2023-12-04 07:42:26 +0900
Started GET "/uploads/recipe/photo/2/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-11-10_20.28.18.png" for ::1 at 2023-12-04 07:42:26 +0900
Started GET "/uploads/recipe/photo/6/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-11-26_19.02.36.png" for ::1 at 2023-12-04 07:42:26 +0900
Started GET "/uploads/recipe/photo/4/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-11-26_18.56.56.png" for ::1 at 2023-12-04 07:42:26 +0900
  
ActionController::RoutingError (No route matches [GET] "/uploads/recipe/photo/3/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2021-11-03_20.54.31.png"):
  
  
ActionController::RoutingError (No route matches [GET] "/uploads/recipe/photo/6/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-11-26_19.02.36.png"):
  
  
ActionController::RoutingError (No route matches [GET] "/uploads/recipe/photo/2/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-11-10_20.28.18.png"):
  
  
ActionController::RoutingError (No route matches [GET] "/uploads/recipe/photo/4/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-11-26_18.56.56.png"):
  
Started DELETE "/recipes/9" for ::1 at 2023-12-04 07:42:29 +0900
Processing by RecipesController#destroy as TURBO_STREAM
  Parameters: {"id"=>"9"}
  Recipe Load (0.3ms)  SELECT "recipes".* FROM "recipes" WHERE "recipes"."id" = $1 LIMIT $2  [["id", 9], ["LIMIT", 1]]
  ↳ app/controllers/recipes_controller.rb:43:in `destroy'
  User Load (2.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/recipes_controller.rb:44:in `destroy'
  TRANSACTION (0.2ms)  BEGIN
  ↳ app/controllers/recipes_controller.rb:46:in `destroy'
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/recipes_controller.rb:46:in `destroy'
  Recipe Update (6.6ms)  UPDATE "recipes" SET "photo" = $1, "updated_at" = $2 WHERE "recipes"."id" = $3  [["photo", nil], ["updated_at", "2023-12-03 22:42:29.796603"], ["id", 9]]
  ↳ app/controllers/recipes_controller.rb:46:in `destroy'
  TRANSACTION (1.6ms)  COMMIT
  ↳ app/controllers/recipes_controller.rb:46:in `destroy'
  TRANSACTION (0.1ms)  BEGIN
  ↳ app/controllers/recipes_controller.rb:47:in `destroy'
  Recipe Destroy (0.5ms)  DELETE FROM "recipes" WHERE "recipes"."id" = $1  [["id", 9]]
  ↳ app/controllers/recipes_controller.rb:47:in `destroy'
  Recipe Load (0.4ms)  SELECT "recipes".* FROM "recipes" WHERE "recipes"."user_id" = $1  [["user_id", 2]]
  ↳ app/controllers/recipes_controller.rb:47:in `destroy'
  Recipe Destroy (1.4ms)  DELETE FROM "recipes" WHERE "recipes"."id" = $1  [["id", 8]]
  ↳ app/controllers/recipes_controller.rb:47:in `destroy'
  TRANSACTION (0.3ms)  ROLLBACK
  ↳ app/controllers/recipes_controller.rb:47:in `destroy'
Completed 500 Internal Server Error in 48ms (ActiveRecord: 14.5ms | Allocations: 14126)
ActionController::RoutingError (No route matches ~

は投稿した画像データをエディタから削除しているためが原因です。幸いにも今回のエラーには無関係でした。

どうやって解決したか?

recipeモデルの

recipe.rb
belongs_to :user,dependent: :destroy

これが原因でロールバックを起こしていたようです。これを

recipe.rb
belongs_to :user

に変えると削除リンクがパスするようになりました。削除できた考えられる理由は編集前、投稿したレシピに写真が貼付されていたのが原因と考えています。

一難去ってまたエラー

pushしようとした途中、一覧画面が表示されなくなるエラーが発生。どうやら、写真を表示するというコードがエラーになっている様子。つまり写真がない投稿があるわけですね。ならば写真の有無を問わず投稿を表示させましょう。

  <% if @recipe.photo_url.present? %>
  #もし写真があるなら
    <%= image_tag @recipe.photo_url %>
#写真を表示させる
  <% end %>

最後に

今回、ユーザーが削除されたとき投稿も削除するようにした

recipe.rb
belongs_to :user,dependent: :destroy

これが原因でしたが写真を削除したことによる

ActionController::RoutingError

もエラーに戸惑う原因でした。エラーって難しいですね。起きている箇所が分かっても対処するのが難しい。

0
0
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
0
0