はじめに
Ruby on Railsを使ったプログラミング学習をしていた際、入力フォームを作成する方法を調べていると時々見かけるlocal: trueの記述。
これって何だろう…と、ふと疑問に思ったことから調べつつ考察してみることにしました。
結論から言うと、local: trueは、Railsのバージョンによって必要になってくるform_withのオプションでした。
結論にたどり着いた経緯と、この考察の過程を通して今回私が学んだことについて記録していきます。
local: trueとは?
今回、私がlocal: trueを調べてみようと思ったきっかけのコードがこちら。
<%= form_with url: search_path, local: true, method: :get do |f| %>
<% end %>
そもそもlocal: trueは何をするための記述なのでしょうか?
Google検索にて、調べてみました。
form_withのデフォルトがAjax通信…非同期通信になってしまい、local: trueと引数を渡す事で、HTTPリクエストが行えるようになる。
(ただし、これはRails 5.1〜6.0の仕様でRails 6.1からは同期通信がデフォルトに戻っている)
というようなことが書いてありました。
local: trueに頭を悩ませていた当時、私はJavaScriptについての深い知識はありませんでした。
また、非同期通信についても説明記事を確認しながら取り入れたことはあるけど、完全に理解しているかというと微妙…というような状態です。
非同期通信ってlocal: falseとかremote: trueを書いた気がする…どういうことだろう…?と、少しこんがらがってしまったので考えを整理してみることにしました。
考察
とりあえず現状の自分の中の認識を整理するために、キーポイントとなりそうな単語やメソッドについて調べてみます。
まずは、form_withとは何かを確認
form_withとは、railsで情報を送信するためのヘルパーメソッドです。
form_withを使うことにより、簡単に入力フォームに必要なHTMLを作成することができます。
「form_with」は情報を送信するためのヘルパーメソッド。
なるほど、こちらの認識は合っていました。
どちらかというと、非同期通信の理解が足りていない気がしたので、次は非同期通信について改めて考えてみます。
非同期通信とは…
送信者のデータ送信タイミングと受信者のデータ受信タイミングを合わせずに通信を行う通信方式を指します。
TwitterやFacebookでの「いいね」ボタンのイメージ。
Railsにおける非同期通信の仕組み
↓の書き方が同期通信
<%= form_with model: @list, url: '/todolists' do |f| %>
<% end %>
↓のようにlocal: falseのオプションを付けることで非同期通信になります。
<%= form_with model: @list, url: '/todolists', local: false do |f| %>
<% end %>
実際にこの方法で学習を進めて、非同期通信を取り入れることが出来たので、この使い方は合っているはず。
localオプションは、「同期処理にするかどうか」という設定を行うオプションです。
今回、同期処理にしない、つまり「非同期」の処理となるので、local: false(オフ)という設定になります。
先ほどお伝えした通り、form_withを使用する際に何も書かないと、自動的に同期処理になりますが、local: trueという初期設定になっている状態、と言い換えることができます。
やはり、local: trueは同期処理の記述で、初期設定になっており、form_withにわざわざ書く必要がないようです。
では、書く必要がないはずのlocal: trueが使われているのでしょうか…?
前提を理解してきたところで、再び調べてみることにします。
こちらの記事を見させていただいたところ、
Railsでform_withはデフォルトがAjax通信で、非同期通信になってしまい、これはRails 5.1〜6.0の仕様でRails 6.1からは同期通信がデフォルトに戻っている。
とのこと。
実は、最初に調べたときもこの記事は目にしていたのですが、理解が足りないまま眺めていたこともあり、目が滑ってバージョンについての記述の部分を見逃してしまっていました。
ここでようやく、バージョンの違いなのか…!ということに気づき、試しに私が使っているRailsのバージョンを確認してみることにします。
$ rails -v
実行結果
Rails 6.1.7.7
私の使っているバージョンは6.1のようです。
なるほど、だんだん分かってきました。
少し前のRailsのバージョンでは一時期、form_withの初期設定がlocal: falseを付与された非同期通信になっており、
今私が使っているバージョンのform_withの初期設定がlocal: trueを付与された同期通信の状態になっているということなのですね。
理解できた気はしますが、念のためメンターさんにも確認してみることにします。
メンターさんへ確認
考察した内容を元にスクールのメンターさんに確認したところ、私の辿り着いた認識で合っているとのことでした。
やはり、私が使っているRails6.1の場合はlocal: trueを付けても問題はないけど、わざわざつける必要もないとのことです。
ここからメンターさんと一緒にRuby on Railsガイドを確認してみました。
そうすると、
Rails 6.0および5.2では、form_withを使うすべてのフォームはデフォルトでremote: trueを実装します。これらのフォームではXHR(Ajax)リクエストを使ってデータを送信します。これを無効にするには、local: trueを指定してください。
このように書かれていました。
メンターさんによると、現段階で一番新しいRails7、私の使っているRails6.1…というように、最初の数字が特に重要だそう。
確かにこのRuby on Railsガイドを見てみても、上の方にバージョンごとによって表示を切り替えるタブが付いていました。
今までバージョンについてはあまり深く考えていなかったのですが、確かに学習の途中でも、以前はform_forが使われていたけど現在はform_withが推奨されているというような内容を見た覚えがあります。
私は現状では一人で学習を進めていますが、共同開発といった場面になると、作業環境を揃えるといった面でもRailsのバージョンについて意識しておくというのは重要そうです。
さらに、今回のform_withのように、もともと初期設定だった同期通信が非同期通信に変わり、さらに元の同期通信に戻る…というパターンもあるのだと知ることができ、新しいバージョンが出たからと言って気軽に更新できるものでもないんだな…ということも理解することが出来ました。
どのような仕様変更があったか確認しないと、予期せぬ不具合が出てきそうですね…。
また、困ったときはRuby on Railsガイドの自分のバージョンで項目を確認してみるといいとのアドバイスもいただきました。
なんとなく公式のガイドラインなどは難しく感じてしまって敬遠しがちだったのですが、ブログなどの記事だけでなく、公式で改めて確認するという習慣にしていこうと思います。
ちなみに…
私がlocal: trueに対して疑問に思ったときに見ていた記事はこちらの方の記事です。
改めて確認してみると、開発環境として、
・rails: 5.2.4.5
の記述がしっかりと書かれていました。
今まではここのバージョン表記もざっと見ていたのですが、もっと意識して確認するようにしようと思います。
まとめ
今回のlocal: trueの表記について調べた過程で、form_withや非同期通信についての認識を再確認することが出来ました。
今まで見逃していた前提の作業環境部分についてなど、調べた際の記事の読み方も、どこに注意して見ていくかが重要になってくるのがよく分かりました。
調べるうえでも、重要なポイントを見逃さないための基礎知識をきちんと身に着けていきたいです。