コンセプト
画面の一部分だけを書き換える方法としてTurbo FramesとTurbo Streamsがあります。そして大きな違いは、Turbo Framesは画面の一箇所を書き換えるものであるのに対して、Turbo Streamsは複数箇所を書き換えられる点があります。
ただしここではTurbo FramesとTurbo Streamsの違いではなく、何が同じかを説明したいと思います。
<turbo-frame>タグに囲まれた箇所に存在する<a>タグ、もしくは<form>タグからリクエストを送信する<a>タグ、もしくは<form>タグにdata-turbo-frame属性をつけて、対象の<turbo-frame>を指定するTurbo.visit([url], {frame: [turbo-frame名]})を呼び出すturbo-frame: [turbo-frame名]がつきます
<turbo-frame>をターゲットしたリクエストかがわかります(我々が使うことはほとんどありませんが)<form>からGET以外で送信した時)はリクエストのAcceptヘッダーにAccept: text/vnd.turbo-stream.htmlが追加されます。これにより、サーバ側はformat.turbo_streamで応答できるようになります(Railsの場合)
data-turbo-drive="false"にしていない限り、すべての非GETの<form>送信で共通です。つまり、ブラウザ側からTurbo Streamを指定する方法は存在しません。Accept: text/vnd.turbo-stream.htmlは付与されません。これをつけるためにはdata-turbo-streamHTML属性を<a>タグや<form>タグにつける必要がありますContent-TypeヘッダーにContent-Type: text/vnd.turbo-stream.html;をつけて、「Turbo Streamとしてデータを返しましたよ」とブラウザに伝えます。上記を踏まえた上で、いつTurbo Framesになるのか、いつTurbo Streamsになるのかを整理します。
Accept: text/vnd.turbo-stream.htmlがあれば、こっちが優先され、Turbo Streamsとして処理されます上記のことから次のことが言えます