オリジナルのアプリを製作中に始めて遭遇したエラーです。
今までは教材の通りにルーティングを組んで、パスもそれに会うように指定していました。
忘れないように記録しておきます。
ActionController::UrlGenerationError
さて今回遭遇したエラーですが、読んだ感じ、Urlの作成でミスがあるんだと思いルーティングを確認してみました。
エラーが出た場面ですが、ヘッダーからマイページに遷移するときでした。
なのでマイページのアクションを指定した箇所をチェック、、、
resources :users, only: [:update, :mypage] do
member do
get 'mypage', :to => "users#mypage"
get 'mypage/edit', :to => "users#edit"
put 'mypage', :to => "users#update"
end
end
resourcesとmemberで各アクションを行う際にidを含めることを指定しています。
今だからわかるのですが、何で動かへんの??と結構ハマってました
memberを外して、collectionにした場合は上手く遷移できたのでlink_to
に渡しているパスとコントローラーがルーティングと合っていないのかなと思いました
*この辺調べながらだったので間違って書いていたら教えていただけると幸いです
<ul class="navbar-nav">
<% if user_signed_in? %>
<li class="nav-item list-inline-item mypage-link">
<%= link_to mypage_user_path, class: "nav-link " do %>
<i class="fas fa-user-circle mr-2"><label>マイページ</label></i>
<% end %>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "nav-link" %>
〜(以下略)〜
これだけじゃ上手くいってるような気がしてならなかったのですが、エラー文で検索していたところ同じエラーに遭遇している人がいらっしゃったので記事を参考にして訂正したら上手くいきました。
結果から言うと、memberで動かないのにcollectionで動いたのは違いがあるようで、memberで指定したルーティングはurlにidを含めて、collectionは含めないようです。
だからmypage_users_pathだとどこのidを取ってくるか指定していないからmemberでは動かないみたいです。
そこでmypage_user_pathに引数として,
current_user(deviseで使えるようになるヘルパーメソッドでログインしているユーザーのこと)を指定してマイページに遷移するときはcurrent_userのidを取ってきてねという風になると思います!
そしてマイページにはUserモデルのカラムを表示させてマイページを作りました。
ルーティング難しいですね。。。。
そもそもidを含める時と含めない時でどう使い分けるのか分かっていないからこんなエラーが出てしまうのだと思います
自分で調べてみますが、有識者の方ご教示いただけると幸いです。
間違いがある場合も教えていただきたいです!