2
2

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 without an ID エラーを解決した

Posted at

rails初学者です。
現在オリジナルアプリを開発しております。
ユーザー詳細機能を実装しようとして、ユーザー詳細画面へのリンクを設定し、動作確認してみたら
「Couldn't find User without an ID」
というエラーが発生したため、エラー解決をしました。

環境

ruby '2.6.5'
rails '6.0.0'

ビュー


<%= link_to "#{current_user.name}", user_path(current_user) %>

このように、ログイン中のユーザーの名前を表示し、名前にユーザー詳細ページへ飛ぶリンクを設定しました。

Usersコントローラー


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

Usersコントローラーのshowアクションで、パラメータのidを受け取って
そのidに合致するユーザーを@userに格納しました。

挙動確認

予想される挙動は、「ユーザー名をクリックするとユーザー詳細ページに遷移する」
ですが、いざクリックしたところ、Usersコントローラーのshowアクションで下記のようなエラーメッセージが出ました。

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User without an ID

簡単に言うとIDがありませんよ、ということです。

パラメーターの確認

showアクションにbinding.pryを仕込み、パラメーターを確認してみました。
すると下記のような結果でした。

 pry(#<UsersController>)> params
=> <ActionController::Parameters {"controller"=>"users", "action"=>"show", "format"=>"1"} permitted: false>

本来ならばid="1"と出て欲しいところが、format="1"となっており
パラメーターにidが含まれていないようです。

結論

ルーティングの記述にミスがありました。


resource :users, only: :show

'resources'と書かなければならないところを、'resource'と書いてしまっておりました。

resourceメソッドはresourcesメソッドに対して、indexアクションとid付パスを生成してくれないみたいです。
そのため、パラメーターにidが含まれていませんでした。

解決策

ルーティングを


resources :users, only: :show

と書き直しました。

再度挙動を確かめたところ、問題なくユーザー詳細ページに遷移しました。

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?