2
8

More than 1 year has passed since last update.

form_withについて

Last updated at Posted at 2022-02-25

はじめに

form_withは初学者にとって理解しずらい部分だと思います。
modelオプションとurlオプションのところで、よく分かってなかったことがありました。

フォームとは

ユーザーが情報を入力する入力欄のこと。
アカウント登録ページに出てくる名前とかemailとかを入力する四角い箱の事です。

form_withとは

フォーム作りを助けてくれるヘルパーメソッドです。
ヘルパーメソッドとはRailsにおける、主にビューでHTMLタグを出現させたりテキストを加工するために使うメソッドの総称です。

例えば、HTMLで以下のように書くのを

<form action="/tweets" method="post">
    <input type="text" name="content">
    <input type="submit" value"送信">
</form>

以下のように書きます。

<%= form_with url: "/tweets", method: :post, local: true do |form| %>
  <%= form.text_field :content %>
  <%= form.submit '送信' %>
<% end %>

ヘルパーメソッドはRubyとして取り扱われるので、<%= %>で囲んで表示します。
doからendまでの間がフォームの記述になります。

form_withのオプションについて

form_with(model: 〇〇, url: 〇〇, method: 〇〇・・・)

form_withの後に続く引数(オプション)がたくさんあります。
それぞれフォームがどのような動きをするか決めています。

modelオプションとurlオプションについて

ここの理解が不十分でした。
urlオプションはフォームでいうaction属性と同じ役割で、modelオプションはインスタンス(データを保存する変数)をフォームに渡す役割だと思っていました。
間違いではないです。しかし、これだけの認識だとハマります。

なぜならurlオプションの記述がないform_withがあるからです。
データの送り先はどうやって決まるのか。
なぜurlオプションがないのか。

<%= form_with model: @tweet, local: true do |form| %>

実は上記のコードは

<%= form_with model: @tweet, url: tweet_path, local: true do |form| %>

と同じ意味です。

このように記述できるのには理由があります。

form_withの賢さ

form_withは@tweetという変数の中身があるか、ないかで次のアクションを予測しています。
@tweetが空の場合はtweets_path(createアクション)へデータを送る。
@tweetが何かデータを持っていた場合tweet_path(updateアクション)へデータを送る。
このようなことを勝手に行ってくれます。
つまりurlオプションで送り先を指定しなくてもいいのです。

オプション名 意味
modelオプション 入力値を格納するインスタンス(form_withによるaction属性の指定)
urlオプション フォームで入力した情報の送信先を指定
methodオプション 情報の転送方法を指定。主にgetかpost
localオプション リモート送信を無効にするかどうかを指定。trueにすると無効になる

おわりに

form_withはまだ分からないことがあります。
また間違いなどございましたら、コメントいただけると幸いです。
お手数お掛けします。よろしくお願い致します。

参考

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8