質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

2回答

282閲覧

【Rails7 / Turbo】redirect_to の場合にのみTurboを無効化する

stimlocy

総合スコア11

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2024/03/06 06:54

実現したいこと

Rails7では、デフォルトで hotwire/turbo が導入されており、link_to や button_to で有効になっています。

app/javascript/application.js

javascript

1import "@hotwired/turbo-rails"

この時、redirect_to の場合のみTurboを無効化するオプションは存在しますか?

発生している問題・分からないこと

button_to などでは、turbo_confirm を使用することで確認ダイアログを表示することができますが、
controller 上で別ページへリダイレクトされる際にも、TurboDriveが効いてしまいDOMの一部分しか書き換わりません。

遷移先のページにGoogleMapなどを利用していると、GoogleMapのロードに初期化に失敗したりと副作用が多いため、ページ全体をリロードするようにTurboを無効化したいです。
しかしbutton_toの時点でTurboを無効化してしまうと、Turboのダイアログも無効化されてしまい表示されません。

該当のソースコード

html.erb

1<%= button_to "Destroy", post_path(@post), method: :delete, data: { turbo: false, turbo_confirm: "Are you sure?" } %>

ruby

1# DELETE /posts/1 2def destroy 3 @post.destroy! 4 redirect_to posts_url, notice: 'successfully', status: :see_other 5end

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

form を生成する button_to ではなく link_to でも同様の現象が発生しております。

html.erb

1<%= link_to "Destroy", post_path(@post), data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>

hotwired/turbo-rails の Github issues でも検索してみましたが、めぼしい結果は得られませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

JSの confrim を参考に、独自で確認ダイアログを用意する方法で実装しました。

js

1window.delete_confirm = function delete_confirm(message = '本当に削除しますか?'){ 2 if(window.confirm(message)){ 3 return true; 4 } else { 5 return false; 6 } 7}

html.erb

1<%= button_to "Destroy", post_path(@post), method: :delete, data: { turbo: false }, form: {onSubmit: "return delete_confirm('Are you sure?')" } %>

投稿2024/03/19 05:02

stimlocy

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

遷移先のページにGoogleMapなどを利用していると、GoogleMapのロードに初期化に失敗したりと副作用が多いため

対応策としては、以下の2つが考えられます。

  • Google Mapの表示をTurbo対応に作り変える(ページ遷移のタイミングを見て表示処理を差し込むなど)
  • 当該ページへ向かうリンク(あるいはその祖先要素)にdata-turbo="false"を追加する

投稿2024/03/07 00:18

maisumakun

総合スコア145192

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stimlocy

2024/03/19 05:34

GoogleMapの callback=initMap タイミングやpin、pathの描画タイミングを、turboのcallbackを把握しながら処理させるのは難しいと考えたため、GoogleMapのturbo対応は諦めました。 また、リンクあるいは祖先要素でturboを無効化してしまうと、質問本文のコードと同様に、子要素の確認ダイアログが表示されなくなってしまいます。 そのため、自己解決に記載したように、turbo側で用意されている確認ダイアログとは別に、独自で確認ダイアログのfunctionを用意して、submitでfunctionを発火させるような形を取りました。 試してはいませんが、link_toでもhrefにJSの発火を対応させれば同じようになるかと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問