はじめに
本記事では、form_with
についてまとめました。
本日、深掘りした内容になりますので、アウトプットいたします。
ヘルパーメソッド
Railsにおける、主にビューでHTMLタグを出現させたり、
テキストを加工するために使用されるメソッドの総称です。
以下のようなものがあります。
ヘルパーメソッド | 使用用途 |
---|---|
form_with | 投稿ページなど、情報を送るためのフォームの実装 |
link_to | リンクの実装 |
他にもたくさんのヘルパーメソッドがありますが、初めに学習するものは上の2つです。
パスについて
パスの指定方法は、大きく分けて2種類あります。
①URL(URIやPrefixを記述する方法)
②modelオプション
URL(URIやPrefixを記述する方法)
例えば、
<%= link_to "編集する", edit_prototype_path(@prototype), class: :prototype__btn %>
edit_prototype_path(@prototype)
ここの部分です。
データベースに保存しないパスの方法
としてよく用いられております。
レコードに生成した情報を保存・追加しないということです。
これまで学習したアプリケーションを確認していると
index→show
に画面遷移する際など、直接的にデータを保存せず、
ただページを遷移
する際に多く使われている印象です。
「url:」の有無
付けることによる弊害は特に無いです。
付けるか付けないかは、保存先のコントローラーでない場合には付けます。
↑後述のFormオブジェクトの話です。
不安であれば、付けておけば問題ありません。
modelオプション
例えば、
<%= form_with model: prototype, local: true do |f|%>
model: prototype
ここの部分です。
データベースに保存するパスの方法
としてよく用いられております。
URLの逆で、レコードへ生成したものを保存・追加するということです。
ですので、new
や、edit
のファイルで使用されている印象があります。
削除するためのパス
<%= link_to "削除する", prototype_path(@prototype), method: :delete, class: :prototype__btn %>
prototype_path(@prototype)
ここの部分です。
こちらについては、両方用いられております。
URLの方が見やすく、使用しやすいため、URLを利用されることが多いです。
URLとmodelオプションの両方を使う場合
例えば、
<%= form_with id: 'charge-form',url: item_purchases_path(@order_form) ,model: @order_form ,class: 'transaction-form-wrap',local: true do |f| %>
url: item_purchases_path(@order_form) ,model: @order_form
ここの部分です。
前述での、url:
を付けるかどうかの話はここです。
2つ使う理由
Formオブジェクト
を使う際に、両方使用します。
例えば、商品を購入する際、
発送する住所のテーブル
と購入記録のテーブル
に対して、
Formオブジェクト(上のコードではorder_form
をFormオブジェクトにしています)を使っているとします。
当時の私はこう考えました。
購入ページへ遷移後、
その購入ページから購入ボタンを押し、
発送する住所
と購入記録
の情報を保存するものだと考えていたため、
まずここでは、modelオプション
を使うのだと思いました。
ただ、ここでは、Formオブジェクト
を使用しているため、
order_formへ保存をしたいわけではなく、
その後から、発送する住所と購入記録に仕分け
し、
それらへ保存したいため、やはりmodelオプションは使わず、
URLパスを使用する
、と判断しました。
しかし、発送住所と購入情報のデータに保存をするためには、
order_formを通って
一時的にorder_formへ送らないといけない(保存みたいな?)ことから、
2つ(URLとPrefix)を使用する
のだと思いました。
要するに、
情報をテーブルに保存するために、
中間にいるFormオブジェクトへワンクッション置いて(URL)、
正式なテーブルへ保存(Prefix)する、そんなニュアンスです。
フォーム送信
↓
Formオブジェクト(ここでワンクッション)
↓
いろんなテーブル(今回だと発送する住所と購入記録のテーブル)
他に使用するケース
ほとんどないと思います。
例えば、
modelオプションを使用しても、画面が遷移されない時
とかだと思います。
終わりに
この辺は私にとってかなりの鬼門でした。
なかなか理解できず、
うまくパスが記述できずに、エラーが出続けておりました。
毎日のように深掘りしなければ理解できないことばかりですが、
理解できて、それをコードで上手く表現できた時が一番嬉しいですし、
報われたみたいで、幸せになれます🤗
明日も頑張ります!!