はじめに
長かった某フリマアプリのコピーページ作成もいよいよ最終段階になりました。
まだ、ページからページへのリンクができていなかったのでそこに取り掛かりました。
そこでユーザー編集ページに飛ばすpathを設定したが、以下の画面に
ほほぅ、めんどくさいことになってますな。
注目して欲しいのはこの部分
No route matches {:action=> "edit", :contoroller=> "profile", :user_id=>1},missing required keys[:id]
翻訳すると、アクション、コントローラ、user_idは参照できたけど、[:id]ってどこですか?と聞かれています。
rake routesで確認してみよう
では、パスとそのURLはどうなっているのかを確認するためにrake routes
を実行してみたのがこれ
edit_user_profileのUrl patternが、/user/:user_id/profiles/:id/edit
になってる
ややこしいな!ベーコンエッグつくねライスバーガーかよ!
とツッコミたくなるような複雑なurlになっておりました。そりゃ色々と要求されるわけですよ。
解決策
まずはroutes.rbを確認
そこでroutes.rbを確認してみました。
resources :users, only: [:index, :show, :new] do
collection do
~略~
end
resources :profiles, only: [:edit]
end
原因は、resources :profiles, only: [:edit]
です。
resourcesを使用すると、
コントローラ#アクション(index, new, create, show, edit, update, destroy)が生成されます。
resourcesでルートを設定し、さらにresources :usersに入れたために、あんなに長いurlができたしまったわけです。
では、どうすれば良かったのでしょうか
memberを使おう!
ルーティングを追加したい場合はmemberブロックをソースブロック1つに追加します。
memberを使って書き直したのがこちら
resources :users, only: [:index, :show, :new] do
collection do
~略~
end
member :profiles, only: [:edit] do
end
end
これでもう一度rake routes
をすると
profile_edit_user GET /users/:id/profile/edit(.:format) profiles#edit
users/:idの後ろに、profile/editが追加された/users/:id/profile/edit
というurlが生成されました。
これで該当部分を書き換えてあげたら、エラーは解消されました。
最後に
エラー文はわかったけれども、エラー原因に漕ぎ着けることができなかったのが個人的には悔しいです。
カリキュラムも終わりなので、railsのガイドやHTML,CSSの勉強もやりながら就活に励みたいと思います。
参考ページ
railsのルーティング
https://railsguides.jp/routing.html