rails 技術ブログ

rails 技術ブログ

勉強したことをアウトプットしていきます

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を引き継いでいないため、自動生成されません。
エラーメッセージを表示させたい時はフラッシュメッセージ等を使い、自分で作成する必要があります。