form_withの使い方
form_withとは
railsで情報を送信するためのヘルパーメソッド。
入力フォームを作成したい時に用いる。
form_withタグを使うとHTMLに変換された時に自動でauthenticity_tokenというセキュリティを高める隠しフィールドが生成されます。(GET以外のリクエストがきた時に、アプリ内からの有効なリクエストかどうかを判断してくれる)
使い方
form_withを使い、ユーザ登録フォームの値を受け取る時のコードは↓のようになります。
form_with(model: @user, local: true)
model: @user
→どのモデルを対象にしてフォームを作るのかを伝える
local: true
→(ajaxを使うのがデフォルトになっているので)HTMLだけ使う、ということを明示している
モデルを作らずにフォームの値を受け取りたい時は?
例えば、ログインフォームを作りたい時は新たにモデルを作成しないため、model:
の引数をどうすれば良いのか…
その時はform_withタグに渡す情報が少し増えます。
form_with(url: login_path, scope: :session, local: true)
url: login_path
→「受け取った情報をpostリクエストでどこに送るのか」を伝える
scope: :session
→paramsの情報はハッシュのハッシュとして入るので、どこのハッシュに入れるのかを伝える
★ハッシュのハッシュとは?
params[:session]
このようになり、さらにこの[:session]のなかに{ session: { password: "foobar", email: "user@example.com" } }
入力された情報が入るようになる。
渡すモデルがない時、なぜ↑のような情報を送る必要があるのか?
model: @user
などと定義できる時は@userの中身を見て「ユーザモデルはActiveRecordと繋がっていて、データベースに保存するもの。そしてまだ中身が何も入っていない。ということは更新ではなく、新しくデータを作成するものだ!新しく作るということは/usersにpostリクエストを送ればいいんだ」と自動的に判断してくれています。
しかし、定義できない場合は判断できる情報がないため、どこに何を送るのかを渡してあげる必要があります。
エラーメッセージについて
入力フォームに誤りがあった場合、ActiveRecordを引き継いでいるUserモデルの場合はエラーメッセージが自動で生成されますが、上で例えたsessionなどはActiveRecordを引き継いでいないため、自動生成されません。
エラーメッセージを表示させたい時はフラッシュメッセージ等を使い、自分で作成する必要があります。