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リクエストの種類も変更することができます。