0
0

More than 3 years have passed since last update.

URL Patternが「users/:user_id/profiles/:id/edit」とややこしくなってしまった話

Last updated at Posted at 2019-11-02

はじめに

長かった某フリマアプリのコピーページ作成もいよいよ最終段階になりました。
まだ、ページからページへのリンクができていなかったのでそこに取り掛かりました。
そこでユーザー編集ページに飛ばすpathを設定したが、以下の画面に
Image from Gyazo
ほほぅ、めんどくさいことになってますな。

注目して欲しいのはこの部分

No route matches {:action=> "edit", :contoroller=> "profile", :user_id=>1},missing required keys[:id]

翻訳すると、アクション、コントローラ、user_idは参照できたけど、[:id]ってどこですか?と聞かれています。

rake routesで確認してみよう

では、パスとそのURLはどうなっているのかを確認するためにrake routesを実行してみたのがこれ
Image from Gyazo

edit_user_profileのUrl patternが、/user/:user_id/profiles/:id/editになってる

ややこしいな!ベーコンエッグつくねライスバーガーかよ!

とツッコミたくなるような複雑なurlになっておりました。そりゃ色々と要求されるわけですよ。

解決策

まずはroutes.rbを確認

そこで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を使って書き直したのがこちら

routes.rb
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

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