0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript ページをリロードしないと動かない(RubyonRails)

Posted at

RubyonRailsにてフリマアプリ実装中、JavaScriptがうまく動かなかった件について。
初学者のアウトプット用記事なので、情報の信憑性の低さについてはご容赦ください。同じところで苦戦している初学者の方にも参考になれば幸いです。

当記事はRails7で実装した際の記録であり、具体的にはgemfileに以下のTurbolinksに関する記述がある場合を想定しています。該当しない場合は、当記事の内容が合わない場合がありますのでご注意ください。

gemfile
# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev]
gem "turbo-rails"

不具合の具体的な内容

商品出品ページで販売価格を入力した時に、販売手数料と利益も同時に表示されるようにしたい。JavaScriptの実装後、ローカル環境で動作を確認したときに問題発生。JavaScriptのコードは問題なく書けているのに、商品出品ページに遷移しても動かない。なぜ?

商品出品ページを開いた状態でリロードすると、正常に動くようになる。でも、一度トップページに戻ってまた商品出品ページに遷移するとまた動かない、リロードすると動く、の繰り返し。

ページ遷移だけで動かないのはTurbolinksが原因

原因を調べてみるとRailsにデフォルトで組み込まれているTurbolinksという機能が影響して、上記のような誤作動が起こっているようでした。Turbolinksを無効化することで、JavaScriptが正常に動くようになります。

ただし、Turbolinksはページ遷移を高速化するために組み込まれている機能なので、ユーザーが快適にアプリを使えるようするために必要な機能です。なので、無効化が必要な箇所にだけ以下の記述を行います。

解決方法(Tubolinksを無効化)

Tutbolinksを無効化する方法のひとつに、link_toにdata: {turbo: false}を追記する方法があります。

元の記述

index.html.erb
<%= link_to('/items/new', class: 'purchase-btn') do %>

Turbolinksを無効化

index.html.erb
<%= link_to('/items/new', data: {turbo: false }, class: 'purchase-btn') do %>

トップページから商品購入ページに遷移する際のTurbolinksを無効化したいので、トップページのビュー(index.html.erb)に記述してあるlink_to(商品出品ページへのリンク)にdata:{turbo: failse}を追記しています。

Turbolinksを削除すれば簡単?

Turbolinks自体を削除すればJavascriptが問題なく動くようになりますが、この方法はおすすめできません。理由は上記のとおり、Turbolinksはページ遷移の高速化をしているので、こちらの恩恵を受けられなくなるからです。

まとめ

・Turbolinksの影響で、ページ遷移時にJavascriptが正常に動かないことがある。
・ページ遷移で動かなくても、リロードすると動くようになる。
・TurbolinksはRailsにデフォルトで入っているGem。
・Turbolinksを無効化するとJavaScriptが正常に動作するようになる。
・TurbolinksでRailsアプリのページ遷移を高速化している。
・link_toにdata: {turbo: false }を記述することで、無効化が必要な箇所だけ無効化することができる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?