0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails:form_withのmodelオプションで正しいURLヘルパーが見つからない(NoMethodError undefined method `xx_path' )

Posted at

環境
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+αでルーティングを行っていることを確認する必要がある

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?