form_for(@user) のカッコの中身って一体なに?

form_forの使い方がいまいち分かってない。
form_for(@user) の(@user)ってそもそも何を意味するんだ……と思ったので調べました。

結論 モデルオブジェクトである

form_forの引数にとるのは「モデルのオブジェクト」だということが分かりました。

Userコントローラのnewアクション内で

@user = User.new

と定義しているので、Users#newが描写された時点でUserモデルのオブジェクトが新規作成され、
「新規作成したUsersモデルのオブジェクトに、フォームで入力した内容を渡しますよ」という働きになるんですね。

form_forの送信先

ちなみに検索した記事に
「submitボタンをクリックした時の動作は、新規作成ならcreateアクションが、編集ならupdateアクションが呼び出される」
という記述があって混乱したんですが、これは

resourcesで供給されるRESTfulなルーティングでは、「~/users(リソース名)」にPOSTリクエストを送るとusers#createを参照する、という事になっているのでそういう書き方になるんだということが分かりました。

form_forという組み込み関数は

  • RESTfulなルーティングに則り、例えば「Userモデルのオブジェクト」が渡されたらURL「/users」にリクエストを渡す。
  • そのリクエストは、渡されたオブジェクトが「新規作成されたものだったらPOST、既存のものの編集だったらPATCH」になる

という動きをするように作られているんだな、ということで理解をしました。

Railsチュートリアルの復習~

Railsチュートリアルでは未送信のユーザー登録フォームと送信直後のURLが異なっているという問題に

ルーティングを

get  '/signup',  to: 'users#new'
post '/signup',  to: 'users#create'

form_forのオプションに

form_for(@user, url: signup_path)

と記述することでURLを統一しました。このように

url: ○○_path

と記述することで送信先を意図的に変更することもできるんですね。ちなみに

method: patch

でHTTPリクエストの種類も変更することができます。