見出し画像

【Rails】formヘルパーの理解

※この記事は有料設定ですが、無料で全て読めます。
役に立ったら投げ銭してください。

Railsチュートリアル完走後の時の私が、「こんなことを教えてくれたらな」とか「こんなことを知りたかった」と思った内容を書きました。

◇formヘルパー

Railsではformに関するヘルパーが用意されています。

・form_for
・form_tag
・form_with

それらの細かい使い方についてはRailsドキュメントなどを参照してもらうとして、今回はもっと根本的な理解について説明します。

◇formヘルパー丸覚えしがちだけど・・・

当時の私がそうでしたが、「どのように動いているのか」というロジックの部分の理解をせずに、ただただformヘルパーの使い方(構文)を丸暗記してしまってました。しかし、丸暗記したところで理解が足りなければ応用は効きません。これらのヘルパーが一体、裏で何をしているのかを理解しましょう、

◇実はHTMLに変換しているだけ

結論をいうとformヘルパーはhtmlに変換しているだけです。
htmlのformタグをいい感じに書いてくれるのがformヘルパーです。
つまり、極論を言えばformヘルパーを使わずとも、html文を直接記述すればフォームが作成できます。

私もそうでしたが、そもそもhtmlをきちんと勉強してformタグの存在を知っていないと、この事に気がつきません。
この事に気がつかないと、formヘルパー丸暗記に陥ってしまいがちです。
(※別に批判のつもりではないですが、progateではhtmlのformタグについての学習がなかった(はず)ので、「progate→railsチュートリアル」という、よくある勉強だとここでつまずいてしまいます)

◇まずはhtmlでのformを学ぶべき

一般的な連絡フォームを作るのを想定しましょう。(↓みたいなやつ)

画像1


<form>、<label>、<input>、<textarea>、そして <button>のhtml要素を使用します。

<form>要素

すべての HTML フォームは、以下のように <form> 要素から始まります

<form action="/my-handling-form-page" method="post">

</form>
action 属性:フォームで収集したデータの送信先URLを定義
method 属性:データを送信時のHTTP メソッド ("get" や "post") を定義


<label>、<input> 、 <textarea> 要素

連絡フォームはとてもシンプルで 3 つのテキストフィールドを持っており、それぞれにラベルがついています。名前の入力フィールドは、基本的な単一行のテキストフィールドです。メールアドレスの入力フィールドは、メールアドレスだけを受け付ける単一行のテキストフィールドです。メッセージの入力フィールドは、基本的な複数行のテキストフィールドです。

HTML コードで、それらは以下のようになります:


 <div>
   <label for="name">Name</label>
   <input type="text" id="name" name="user_name">
 </div>
 <div>
   <label for="mail">E-mail</label>
   <input type="email" id="mail" name="user_mail">
 </div>
 <div>
   <label for="msg">Message</label>
   <textarea id="msg" name="user_message"></textarea>
 </div>

注目して欲しいのは"name"という属性です。nameで定義されている文字列がHTTPリクエストで送信するパラメーターのkeyとなります。そしてフォームランに記入した文字列がvalueとして格納されて送信されます。

HTTPリクエストのパラメーターについてはこちらで解説してます。


<button>要素

</form>の直前に以下の行を追加します

<div class="button">
 <button type="submit">Send</button>
</div>
submit 属性:クリックするとフォームのデータを、 <form> 要素の action 属性で定義したURLへ送信します。


おさらい

全体的になコードはこんな感じになります。

<form action="/my-handling-form-page" method="post">
  <div>
    <label for="name">Name</label>
    <input type="text" id="name" name="user_name">
  </div>
  <div>
    <label for="mail">E-mail</label>
    <input type="email" id="mail" name="user_mail">
  </div>
  <div>
    <label for="msg">Message</label>
    <textarea id="msg" name="user_message"></textarea>
  </div>
  <div class="button">
    <button type="submit">Send</button>
  </div>
</form>


◇勉強のやりかた

ドキュメントを見ながらform_tag, form_for, form_with で実装してみて、実際に変換されたhtmlコードを覗くのが一番の近道かなと思います。このとき、色々ヘルパーでの引数を変化させながらhtmlを確認すると理解しやすいのかなと思います。
(htmlでの確認の仕方は、ブラウザがchromの場合右クリックで「ページのソースを確認」で見る事ができます)

=======================================================

◇この記事が役に立ったら

記事の内容としてはこれでおしまいですが、もしもこの記事が役に立たら、ページ下の「気に入ったらサポート」ボタンから投げ銭して頂けると幸いです!
noteの会員でない方でも、下の「記事を購入する」ボタンからこの記事を100円で購入することが可能です!
あなたの投げ銭がモチベーションに繋がるので、よろしくお願いします!

ここから先は

146字

¥ 100

この記事が気に入ったらサポートをしてみませんか?