環境
Ruby:3.2.2
Rails:7.1.5
期待していた動作
form_with model: [:admin,user]
・modelオプションによるリソース識別で最終的なフォーム送信先がadmin/users(POST)になっていてほしい。
症状
・admin_pathを探してNoMethodエラーが出ている。
・エラーメッセージは以下の通りだった
NoMethodError in Admin::Users#new
undefined method `admin_path' for #<ActionView::Base:0x000000000529e0>
推察
・modelオプションでは生成するHTMLのaction属性のURL(フォームの送信先パス)に変換する前にURLヘルパーを探している?
・そして今回探されるべきURLヘルパーはadmin_pathではなくadmin_user_pathなのではないか?
調査
・modelオプションの挙動。内部の仕組みが記述されている記事は見つけられなかったが、結果から見るとmodel:xxと指定したとき⇒xx_path/model:[A,B]と指定したとき⇒A_B_pathというURLヘルパーを探すようである。
・またmodelオプションでのリソース識別を行う前提条件としてresources/resource+αでルーティングを行っていることを確認する必要がある
・前提条件となるresourcesでのルーティングは確認できた。
・またrails routesでパスとurlヘルパーの対応関係を確認したところ、期待するパスに対応するURLヘルパーはやはりadmin_user_pathであることが確認できた。
⇒modelオプションの@userにuserオブジェクトが代入されていないのではないか?
解決策
・やはりコントローラーでのビューに渡すインスタンス変数名がタイポ(正:@user)していたため正しいURLヘルパーを探していないことが原因だった。
def new
@users = User.new
end
抽象化・一般化・重要なポイント
・model:xxと指定したとき⇒xx_path/model:[A,B]と指定したとき⇒A_B_pathというURLヘルパーを探す
・modelオプションでのリソース識別を行う前提条件としてresources/resource+αでルーティングを行っていることを確認する必要がある