はじめに
本記事では、
ActiveRecord::RecordNotFound~
の
Couldn't find User with 'id'=
というエラーを解決しましたので、
アウトプットします。
エラーが出ていたコード
編集(edit)→updateの実装をできるようにしておりましたところエラーが出てしまいました。
無事に編集できれば、マイページに遷移できるようにしようとしています。
先にコードを載せます。
class UsersController < ApplicationController
def show
user = User.find(params[:id])
@nickname = user.nickname
@foods = user.foods
end
end
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
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のid
とuserのid
が同じになるようになってしまっています。
ex)id=3のfoodは、id=3のuserが投稿したことになっている。
念の為、Sequel Proでfoodのidを1に変更し、userのidが1のuserで試したところ、
うまく編集できました。
つまり、
foodを投稿したuserになるようにコードを書き換えれば良いのでは?
という結論に至りました。
以下、コードをなんとか記述してみたところ、
以下のようにすれば、うまくいきました。
「追記」
うまくいきませんでした。
一瞬うまくいっていたのはなんだったのか。。。
間違えた結論も備忘録として残しますので、その後に最終的な結論を記述します。
紛らわしいことをしてしまい申し訳ありませんでした。
以下は間違えていたものです(追記)。
Before
class UsersController < ApplicationController
def show
user = User.find(params[:id]) #ここを!!
@nickname = user.nickname
@foods = user.foods
end
end
After
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
if @food.update(food_params)
redirect_to user_path
else
render :edit
end
After
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
明日も頑張ります!!