form_withメソッドとは
フォームを実装するためのヘルパーメソッドです。
ヘルパーメソッドとは、主にビューでHTMLタグを出現させたりテキストを加工するために使用するメソッドのことです。
HTMLのformタグの代わりに使用できます。
【例】HTMLのフォーム記述
<form action="/posts" method="post">
<input type="text" name="content">
<input type="submit" value="投稿する">
</form>
↓↓これをこのように書き換えることができます
【例】ヘルパーメソッドを用いたフォーム記述
<%= form_with url: "/posts", method: :post, local: true do |form| %>
<%= form.text_field :content %>
<%= form.submit '投稿する' %>
<% end %>
ヘルパーメソッドはRubyとして取り扱われるので、表示するために<%= %>
で囲んで使用します。
do〜endの間に、表示される投稿フォームの内容を記述していきます。
form_withを使うメリット
1.パスの指定やRubyの埋め込みなどの記述がシンプルになる
2.セキュリティ上の問題を解消する
form_withメソッドのオプション
<%= form_with url: "/posts", method: :post, local: true do |form| %>
・urlオプション:フォームの情報を送るリクエストのパスを指定。
・methodオプション:フォームの情報を送るリクエストのHTTPメソッドを指定。オプションの初期値は:postなので、postメソッドを指定する場合は省略することが可能。
・localオプション:リモート送信を無効にするかどうかを指定。trueにすると無効になる。
※urlオプションやmethodオプションは、先に説明したform要素のaction属性やmethod属性に対応するものです。
form_withでのフォームの部品の作り方
form_withのブロック変数「form」とヘルパーメソッドを組み合わせることで、フォームに部品を追加できます。
<%= form_with url: "/posts", method: :post, local: true do |form| %>
<%= form.text_field :content %>
<%= form.submit '投稿する' %>
<% end %>
上記の例であれば、<%= form.text_field :content %>
〜<%= form.submit '投稿する' %>
という記述で、ビューに表示されるフォームの部品を生成しています。
フォーム部品のヘルパーメソッド例
・text_field:1行のテキストボックス
・password_field:パスワード入力ボックス(入力したテキストがアスタリスクなどに置き換えて表示される)
・check_box:チェックボックス(複数選択可能)
・radio_button:ラジオボタン(複数の中から1つしか選択できない)
・submit:送信ボタン
ここではsubmitを除いて、これらのヘルパーメソッドの引数には、name属性にあたる名前が入ります。(form.text_field :content
でいうと、:content
がname属性)
このname属性の値が、データを扱う際の名前(キー)になります。
つまりform.text_field :content
でいうと、ユーザーがform.text_field
に入力した値を管理するのが:content
です。→ { content: ユーザーが入力した値} というハッシュ形式になるイメージ。
modelオプションの値によるリクエストの自動判断
【modelオプションによる自動判断の例】
<%= form_with model: @tweet, local: true do |form| %>
<%= form.text_field :name, placeholder: "Nickname" %>
<%= form.text_field :image, placeholder: "Image Url" %>
<%= form.text_area :text, placeholder: "text", rows: "10" %>
<%= form.submit "SEND" %>
<% end %>
form_withは、modelオプションに指定された値の状態により、リクエストを送るアクションを自動で判断してくれます。
例えば「インスタンス変数@tweet」をmodelオプションの値としたとき、
①modelオプションが「@tweet = Tweet.new」という空のインスタンス変数@tweetの場合
→「空ということは、次はcreateアクションだ!」と自動で判断してくれる。
②modelオプションが「@tweet = Tweet.find(params[:id])」という値の入った@tweetの場合
→「値が入っているということは、次はupdateアクションだ!」と自動で判断してくれる。
そして②のように、modelオプションに指定したものが「すでに値が入っているインスタンス変数」であれば、その変数が持っている値を初期値としてカラムに入れておいてくれます。
以上、form_withに関する基本知識でした。 ご指摘などあれば、ご教授頂けると幸いです。