はじめに
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はまだ分からないことがあります。
また間違いなどございましたら、コメントいただけると幸いです。
お手数お掛けします。よろしくお願い致します。
参考