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
と書き直しました。
再度挙動を確かめたところ、問題なくユーザー詳細ページに遷移しました。
参考