前提
- 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 %>
本来なら、削除が成功して投稿一覧画面なりに飛ぶはずが削除されずエラー画面も出ない。これは困った。
ログを見てみよう
※本来ならこの下にロールバックが出ているログなのですがスクショを撮り忘れていました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
もエラーに戸惑う原因でした。エラーって難しいですね。起きている箇所が分かっても対処するのが難しい。