【Rails】form_with の復習

に公開

Ralisを勉強していたら、form_with(ヘルパーメソッド)の理解ができていなかったため、それを備忘録としてまとめました。
てなわけで、form_withももう一度復習することに。

form_withとはなんぞや

Railsのview内で使用できるフォーマット。
よくある検索フォームとか作れちゃう!?

https://railsguides.jp/form_helpers.html

  • 基本形
    以下が基本形。
    |f|の部分は、ブロック変数(ブロックの内部のみ有効な変数、)。
<%= form_with do |f| %>
  #処理
<% end %>

form_withに追加できるオプションなど

  • モデルとの連携
    modelとの連携を行う場合は、以下の通り。
    modelと連携することで、データーベース(db)へデータを簡単に保存できるなどできる。
<%= form_with model:#モデル名 do |f| %>
  #処理
<% end %>
  • url追加
    基本形に追加する形として、フォームの情報を送信するurlを追加することができる。
    rails routesコマンドで、urlを確認して、記載すると良い。
<%= form_with model:#モデル名, url: '#URL' do |f| %>
  #処理
<% end %>
  • method追加
    これも基本形を追加する形として、上記にしてしたURLをどのメソッドでURLを飛ばすか指定することができる。(ex: POST・PUT・DELETEメソッドなど)
<%= form_with model:#モデル名, url: '#URL', metod: :#メソッド名 do |f| %>
  #処理
<% end %>

local: ture??

form_withメソッドを色々調べてみると、以下のような記載されているものを見つけました。

<%= form_with (model:#モデル名, local: ture) do |f| %>
  #処理
<% end %>

local: ture???なんじゃそれ。

色んな記事とか見てみると、

Rails 6.0および5.2では、form_withを使うすべてのフォームはデフォルトでremote: trueを実装します。これらのフォームではXHR(Ajax)リクエストを使ってデータを送信します。これを無効にするには、local: trueを指定してください。詳しくはRails で JavaScript を使用するガイドを参照してください。

https://railsguides.jp/v6.0/form_helpers.html#セレクトボックスを簡単に作成する

form_withはRailsの比較的新しいメソッド。このメソッドではデフォルトがAjax通信で、非同期通信になってしまうのです。

https://qiita.com/kakudaisuke/items/e032c7705db00e8081dc

v6.1まで記載ありましたが、v7.0になると記載がなくなっておりました。

https://zenn.dev/s17w09/articles/11d22df4ea02df

なんだ現在のRailsのバージョンがv8.0になっているので、関係なくなっちゃったのか。

でも、Ajax通信?非同期通信??分からん用語がでてきたぞ。
一応調べてみると、

  • Ajax通信
    asynchronous(アシンクロナシス=非同期の) javascript + XML の略
    非同期にサーバの間に通信を行うこと。

  • 非同期通信
    プログラム(コンピュータに対する指示をまとめたもの)で処理を行う際に、他の処理も進めることができる処理方法。
    例えば、非同期通信方式を活用しているGoogleMapでは、ページ全体をリロードしていない。
    その結果、処理が重くならないというメリットも。

非同期通信を行うために、Ajax通信という仕組みを使っていると理解した。(Ajax通信は、また今度調べる)

つまり、from-withは非同期処理という処理を行っているため、同期処理(非同期処理の逆。順番に最初から処理を行う処理方法)にしたい。
local:tureがないと、非同期処理になってしまい、ページ全体がリロードされず、必要な箇所だけページが更新されてしまう(エラーになってしまう)。

現在は、関係ないっぽい。

versionごとに廃止されたメソッドもあるから、Railsガイドを読んでみないといけないと学んだ。
知らない用語もあったので、こんな感じで寄り道して調べることも必要だと感じた。

初心者で間違いもあるので、何かあれば指摘してください!

Discussion