コンセプト
画面の一部分だけを書き換える方法として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>
送信で共通です。つまり、POST系の<form>
についてはブラウザ側からTurbo Stream以外を指定する方法は存在しません。Accept: text/vnd.turbo-stream.html
は付与されません。これをつけるためには<a>
タグや<form>
タグにdata-turbo-stream
HTML属性をつける必要がありますContent-Type
ヘッダーにContent-Type: text/vnd.turbo-stream.html;
をつけて、「Turbo Streamとしてデータを返しましたよ」とブラウザに伝えます。これをつけなければブラウザは「Turbo Stream以外である」と解釈します。つまりTurbo Streamを返すかどうかはサーバが決めます。上記を踏まえた上で、いつTurbo Framesになるのか、いつTurbo Streamsになるのかを整理します。
Accept: text/vnd.turbo-stream.html
があれば、こっちが優先され、Turbo Streamsとして処理されます上記のことから次のことが言えます
data-turbo-frame
属性やtarget
属性を使って指定しますTurbo Drive, Turbo Frames, Turbo Streamsなど、Turboの使い方に複数タイプ存在する理由は、簡単なケースでは労力を最小化しつつ、複雑な場合の処理も可能にするためです。
簡単な処理はなるべくTurbo Driveで対応し、徐々にTurbo Streamsにアップグレードしていきます。そのとき、上記の仕組みを頭に入れていると良いのではないかと思います。