質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

868閲覧

記事削除後のCouldn't find Article with 'id'=1を解消したい

AkiDatsugoku26

総合スコア35

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/12/13 15:09

前提・実現したいこと

記事を投稿したり削除できるwebサービスを制作しています。

トップページにはいいねの数によって記事を並べるランキング機能を実装しており、
管理者はこれらの記事を削除できる権限を持っています。

問題なく機能していたと思ったのですが削除機能を改めて確かめてみたところ、
下記のエラーが発生しました。

発生している問題・エラーメッセージ

ActiveRecord::RecordNotFound in HomesController#index Couldn't find Article with 'id'=1

イメージ説明

該当のソースコード

controller

1class HomesController < ApplicationController 2 # before_action :set_article, only: [:index] 3 4 def index 5 @manga = Article.where(category: "マンガ") 6 @illust = Article.where(category: "イラスト") 7 @anime = Article.where(category: "アニメ") 8 9 @all_ranks = Article.find(Like.group(:article_id).order('count(article_id) desc').limit(4).pluck(:article_id)) 10 @new_article = Article.order(created_at: :desc).limit(5) 11 end 12 13 # def set_article 14 # @article = Article.find(params[:article_id]) 15 # end 16end
<div class="lanking-article"> <% @all_ranks.each.with_index(1) do |article, i| %> <div class="ranking-card"> <td class="text-center"> <% case i when 1 %> <i class="fas fa-crown" style='color: gold;'></i> <% when 2 %> <i class="fas fa-crown" style='color: silver;'></i> <% when 3 %> <i class="fas fa-crown" style='color: orange;'></i> <% else %> <%= i %>位 <% end %> </td> <p><%= link_to image_tag(article.image), article_path(article) %></p> <p><%= link_to truncate(article.title, length:30), article_path(article) %></P> </div> <% end %> </div>

試したこと

現状は削除した記事のID(今回の場合はid=1)を一覧画面で表示しようとしたときも参照
してしまっているため"Couldn't find Article" = (削除したので)記事が見つからない
となっていると考えました。

そこで上記のコントローラでコメントアウトされているset_articleメソッドを定義し、
まず全体の記事の確認してから記事を表示しようと考えたのですがうまくいかず悩んでします。

考え方の方向性としてはあっていますでしょうか?
もし最適な考え方や解決策などがあればぜひ助言を頂けると嬉しいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

考え方の方向性としてはあっていますでしょうか?

まずは、記事を削除したときに、すでに付いたいいねをどうしたいかから考えないといけません。

いちばんスッキリするのは、「記事を消したときに、その記事へのいいねもまとめて削除する」ことです。

投稿2021/12/13 21:42

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AkiDatsugoku26

2021/12/14 03:07

maisumakunさん助言ありがとうございます。 「記事を消したときに、その記事へのいいねもまとめて削除する」 →こちらを頼りに記事(article)モデルに   has_many :likes, dependent: :destroyを追記してみました。 狙いとしては記事が消されればLikeも消されるようにしたかったのですが、 どうやらキャッシュが残っているようでエラーは解消できていません。 調べるとafter_destroyの記事がヒットしたのでもう少し粘ります。
maisumakun

2021/12/14 03:18 編集

> どうやらキャッシュが残っているようでエラーは解消できていません。 dependent: :destroyは、「これから削除する分」にだけ効果があります。すでにArticleが削除されてしまったLikeはそのままになっています(削除したいなら手動で削除してください)。
AkiDatsugoku26

2021/12/14 03:25

すぐにご返信頂きありがとうございます。 一旦DBをリセットしてから記事投稿→削除→リロードしてみると問題なく表示されました! 結局after_destoryでキャッシュをクリアはできなかったのですが実務だとよく使うものなのでしょうか。 助言のおかげで解決できました。ベストアンサーにしておきますー!
guest

0

こちらベストアンサーの助言を頼りに解決できましたので共有します。
まず結果からですが記事(article)モデルに以下のコードを追記しました。

model

1has_many :likes, dependent: :destroy

エラー時にはdependent: :destroyが記述されていませんでした。このコードによって記事が消されたタイミングでいいね!(Like)も消すことができます。
ここまでで助言にあった「記事を消したときに、その記事へのいいねもまとめて削除する」をクリアすることができました。

しかし肝心の下記のエラーは解消できません

error

1ActiveRecord::RecordNotFound in HomesController#index 2Couldn't find Article with 'id'=1

なぜか?それは記事を削除したのはコメントにもある通り「これから削除する分」にだけ効果がある為、
既に削除してしまった記事に対しては有効ではないからです。
そしてキャッシュが残っている為このままでは消された記事(今回の場合id:1)を探し続けてしまいエラーが解消されないのだと思います。

いろいろ調べてみましたが僕の場合は結局dbをリセットしテストデータを入れなおしました。

Terminal

1rails db:reset 2 3rake db:seed

これで次回以降記事を削除した場合はいいねも一緒に消されるため、
存在しない記事を探してエラーが出ることもなくなるはずです。

追記
キャッシュを削除する方法としてはafter_destroyなどいろいろヒットしましたがどれも実装することができませんでした。今回の解決策以外で効果的な方法があれば是非教えてください。

投稿2021/12/14 03:41

AkiDatsugoku26

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問