Just do IT

思うは招く

【Rails】リクエストパスとコントローラー名が違う場合の form_with の書き方

自前でサインアップ用のコントローラーを作ったとき、form_withでうまく値が送れなくて少しハマったのでメモる。

問題

たとえば以下のようなルーティングをしているとき。

Rails.application.routes.draw do
  get "/signup", to: "users#new"
  post "/signup", to: "users#create"
end
  • /signupにgetアクセスしたとき、usersコントローラーのnewメソッドが動作してnew.htmlが開く
  • postをしたときはcreateメソッドでユーザー登録する

といった感じになっている。

この状態で、いつものようにform_with model: @user~を書いてもエラーになる。

= form_with model: @user, local: true do |f|~
#エラーメッセージ
NoMethodError in Users#new
undefined method `users_path'

解決

urlを渡すオプションを設定すればよい。

= form_with model: @user, url: :signup, local: true do |f| ~

コントローラーとアクション名を指定して、もっときっちり書くこともできる。

= form_with model: @user, url: { controller: "users", action: "create" }, local: true do |f|~

参考

フォーム(form) | Railsドキュメント