Turbo Framesは画面の一箇所のみを変更するのに対して、Turbo Streamsは複数箇所を変更したり、更新方法を細かく指定したりできます。通常はこれを基準に使い分けます。
ただしもう一つ使い分け方の基準があります。Turbo Framesはクライアント側で制御されるのに対して、Turbo Streamsはサーバ側で制御できることが必要な場合です。
なおこの点については、実例を使って解説しています。
<turbo-frame id="hoge">...</div>に囲まれた箇所からリクエストを送信すれば、レスポンスにも対応する<turbo-frame id="hoge">...</div> (idが"hoge")が存在することが期待され、その中だけが取り出されて画面の更新に使用されます。<a>タグ、もしくは<form>タグにdata-turbo-frame属性をつけて、対象の<turbo-frame>を指定したり、JavaScriptでTurbo.visit([url], {frame: [turbo-frame名]})を呼び出す方法でTurbo Framesを使用する方法もありますが、いずれもクライアント側でレスポンスの処理方法を指定します。turbo:frame-missingイベントが発火しますので、やはりクライアント側で対処します。Content-Type: text/vnd.turbo-stream.html;をつけます。これはクライアントに対して、「Turbo Streamsとして処理しなさい」の合図になります。<turbo-stream action="[アクション名]" target="[ターゲット名]">を返します。サーバ側でDOMのどの箇所(target)に対してどのような変更(action)を加えるかを明示します。クライアントはこれに従います。Accept: text/vnd.turbo-stream.html;ヘッダーをつけることもできます。これはサーバの処理を助けるものであり、Turbo Streamsそのものの動作には影響ありません。<form>タグからのPOST/PUT/PATCH/DELETEリクエストには自動的にこのヘッダーが付きますが、それ以外のリクエストでこのヘッダーを自動的につけたい場合はdata-turbo-stream属性を使います。turbo:submit-endイベントのレスポンスステータスを確認して、画面更新方法を切り替えることもできます。この場合はTurbo Streamsを使わずに、turbo:submit-endのイベントハンドラ(クライアント側)の中で処理を記述します。