技術的背景
データなしターボリンク
data-no-turbolink="true"
リンクに属性を追加するだけで、そのリンクのターボリンクが抑制されることに注意してください。そのリンクをクリックすると、コンテンツがターボリンクに置き換えられるのではなく、ページ全体が読み込まれます。
しかし、ターボリンクを抑制せずに gmaps4rails でターボリンクを使用する方法はいくつかあります。
ターボリンクのコールバック
ターボリンクで何かを動作させるための鍵は、提供されたコールバックを使用することです。この場合、ターボリンクが新しいページをロードしたときにマップのロードを実行するように gmaps4rails に指示する必要があります。
一般に、Railscast #390$(document).on('page:load', function ... )
に示されているように使用できます。
JavaScript の同一生成元ポリシー
gmap4rails gem に含まれるGoogle API スクリプトは、Google 静的サーバーから別のスクリプトを要求します。ただし、API がターボリンクによって動的に含まれている場合、シングルオリジン ポリシーにより、Google 静的サーバーへのリクエストが防止されます。
シングルオリジン ポリシー自体は便利なものです。これを回避する方法はいくつかありますが、これは自然なことではないようです。代わりに、それを行うための「正しい方法」は、Web ページが本当にリモート スクリプト (Google API) を実行しようとしていること、およびリモート スクリプトが悪意のあるスクリプトによって要求されていないことを「証明」することです。これは、Google API を直接リクエストする script タグを html ツリーに含めることによって行われます。
html ツリーに直接 google api スクリプト タグを含めることができるのは、ターボリンクを使用する場合、最初のリクエストでのみ可能です。これは、その後のすべての変更がターボリンクによってツリーに動的に注入されるためです。つまり、ターボリンクを使用する場合、地図を表示しないページでも Google API を含める必要があります。
解決策 1 (推奨): gmaps4rails に fork を使用する
うまくいけば、gmaps4rails の Turbolinks サポートを追加して、プルリクエストを作成しました。
デモ
必要に応じて、ターボリンクで gmaps4rails を使用する方法を示すこのデモを最初に見てください。
プロジェクトでこれを使用する方法
これを試して、フォークを Gemfile に追加することで、プロジェクトで機能しているかどうかを確認できます。
# Gemfile
# ...
gem 'turbolinks'
gem 'gmaps4rails', '~> 2.0.1', git: 'https://github.com/fiedl/Google-Maps-for-Rails.git'
# ...
さらに、HTML ヘッドに API を含めるようにレイアウト ファイルを変更する必要があります。
<!-- app/views/layouts/application.html.erb -->
<html>
<head>
...
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= gmaps4rails_api_script_tags # <-- THIS IS NEW ----------------- %>
<%= csrf_meta_tags %>
</head>
<body>
...
<%= yield %>
<%= yield :scripts %>
</body>
</html>
何らかの理由でこのフォークを使用したくない場合は、ターボリンクと一緒に gmaps4rails を使用する 2 つの代替方法があります。
解決策 2: 手動で行う
基本的に fork と同じことを行い (解決策 1)、レイアウト ファイルのヘッドに API スクリプトを手動で追加できます。次に、ターボリンクを介してページをロードするときに、javascript を使用してマップを構成およびアクティブ化できます。
これは、gmaps4rails wiki で UJS を使用する場合に一般的に示されています:
https://github.com/apneadiving/Google-Maps-for-Rails/wiki/Using-with-UJS
解決策 3: API の静的情報を手動で含める
API スクリプトをグローバルに追加したくない場合は、単一オリジン ポリシーを回避して API を動的にロードする方法があります。
そのための要点を用意しました: https://gist.github.com/fiedl/6573175
次の 2 つのことを行う JavaScript ファイルを追加する必要があります。
- Google マップ API自体を読み込みます。
- API によってロードされる静的ファイルをロードします。
ブラウザーでAPI スクリプトgetScript
を開き、下部の呼び出しから URL をコピーすると、静的ファイルへの URL を見つけることができます。
しかし: これを行うと、静的 API 要求がロケールに修正されます。これは、アプリが国際的に使用されている場合、おそらく良いことではありません。