0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Couldn't find User with 'id'=を解決する→間違えていましたので解決したのち修正します→追記しました

Last updated at Posted at 2021-08-21

はじめに

本記事では、
ActiveRecord::RecordNotFound~
Couldn't find User with 'id'=というエラーを解決しましたので、
アウトプットします。

画像とユーザーのidがリンクしてしまったエラー.png

エラーが出ていたコード

編集(edit)→updateの実装をできるようにしておりましたところエラーが出てしまいました。
無事に編集できれば、マイページに遷移できるようにしようとしています。

先にコードを載せます。

users_controller.rb
class UsersController < ApplicationController

  def show
    user = User.find(params[:id])
    @nickname = user.nickname
    @foods = user.foods
  end

end
foods_controller.rb
class FoodsController < ApplicationController

  def index
    @foods = Food.order("created_at DESC")
  end

  def new
    @food = Food.new
  end

  def create
    @food = Food.new(food_params)

    if @food.save
      redirect_to root_path
    else
      render :new
    end

  end

  def search
    @foods = Food.search(params[:keyword])
  end

  def edit
    @food = Food.find(params[:id])
    return redirect_to user_path if current_user.id != @food.user.id
  end

  def update
    @food = Food.find(params[:id])
    return redirect_to user_path if current_user.id != @food.user.id
    
    if @food.update(food_params)
      redirect_to user_path
    else
      render :edit
    end
  end

  def show
    @food = Food.find(params[:id])
  end

  def destroy
    @food = Food.find(params[:id])
    return redirect_to user_path if current_user.id != @food.user.id
    
    @food.destroy
    redirect_to user_path
  end

  private

  def food_params
    params.require(:food).permit(:image, :meal_type_id, :shop_name, :shop_name_kana, :food_name, :spicy_level_id, :station, :shop_mood_id, :waiting_time_id, :food_comment).merge(user_id: current_user.id)
  end

end
user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  
  has_many :foods
end
<div class="mypage-contents">
  <header class="mypege-header">
  マイページ
  </header>

  <div class="mypage-main">
    <h2 class="mypage-title">MY KARAI</h2>
      <div class="contents row">
      <p><%= @nickname %>さんの投稿一覧</p>
      <% @foods.each do |food| %>
        <li class="list">
          <div class="food-img-content">
            <%= image_tag food.image, class: "food-img" if food.image.attached? %>

            <div class="food-img-content-more">
              <ul class="more_list">
                <li>
                  <%= link_to '詳細', food_path(food.id), method: :get %>
                </li>
                <% if user_signed_in? && current_user.id == food.user_id %>
                  <li>
                    <%= link_to '編集', edit_food_path(food.id), method: :get %>
                  </li>
                  <li>
                    <%= link_to '削除', food_path(food.id), method: :delete %>
                  </li>
                <% end %>
              </ul>
            </div>

            <div class="food-img-info">
              <h2 class="shop-name">
              <%= food.shop_name%>
              </h2>
              <h2 class="food-name">
              <%= food.food_name%>
              </h2>
              <h3 class="food-spicylevel">
              <%= food.spicy_level.name%>
              </h3>
            </div>
          </div>
        </li>
      <% end %>
      </div>
  </div>

    
<%# 省略 %>

結論

エラー内容を見るに、
idが2のuserはおりません。と言っています。
おそらくfoodのiduserのidが同じになるようになってしまっています。
ex)id=3のfoodは、id=3のuserが投稿したことになっている。

念の為、Sequel Proでfoodのidを1に変更し、userのidが1のuserで試したところ、
うまく編集できました。

つまり、
foodを投稿したuserになるようにコードを書き換えれば良いのでは?
という結論に至りました。

以下、コードをなんとか記述してみたところ、
以下のようにすれば、うまくいきました。

「追記」
うまくいきませんでした。
一瞬うまくいっていたのはなんだったのか。。。
間違えた結論も備忘録として残しますので、その後に最終的な結論を記述します。
紛らわしいことをしてしまい申し訳ありませんでした。

以下は間違えていたものです(追記)。

Before

users_controller.rb
class UsersController < ApplicationController

  def show
    user = User.find(params[:id]) #ここを!!
    @nickname = user.nickname
    @foods = user.foods
  end

end

After

users_controller.rb
class UsersController < ApplicationController

  def show
    food = Food.find(params[:id]) #こうした!!
    user = User.find(food.user.id)
    @nickname = user.nickname
    @foods = user.foods
  end

end

追記:最終結論

Before

foods_controller.rb
if @food.update(food_params)
  redirect_to user_path
else
  render :edit
end

After

foods_controller.rb
if @food.update(food_params)
  redirect_to user_path(@food.user_id)
else
  render :edit
end

(@food.user_id)これがなかったため、どこのuser_idなのか分からなかったようです。

終わりに

うまくいっていますが、果たして正解なのかどうかが不安なところです。
ただ、間違いなく編集ができているので、ここは先に進みます!

エラーを読み取る
↓
分析する
↓
どこが悪いのか分けて考える
↓
原因を突き止める
↓
考えながらコードを書いてみる

これを華麗に決めることができたと感じています。

以下今回の参考サイトです。
Couldn't find Item with 'id'= を解決する
ActiveRecord::RecordNotFound in

明日も頑張ります!!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?