0

マーカーが付いたGoogleマップを持つRuby on Railsアプリがあり、クリックするとjavascriptを使用して情報ウィンドウが開きます。データベースからの情報をウィンドウに表示するこのjavascript fnにruby varを入れたいです。

したがって、ユーザーがマーカーをクリックすると、js fn からの一般的なテキストだけでなく、データベースから動的な情報が取得されます。

誰かがこれをやったことがあるなら、どうやってやったか教えていただければ幸いです、ありがとう

4

2 に答える 2

2

タグを使用して html.erb ファイルに JavaScript を直接配置し、JavaScript 内に埋め込まれた Ruby コードを実行できます。変数がアポストロフィなどの特殊文字によってスクリプトを台無しにすることがあるため、escape_javascript を忘れないでください。

<script>
  alert(<%= escape_javascript @variable %>);
</script> 
于 2013-01-23T19:24:48.663 に答える
1

erb で Javascript ファイルを処理する Edward のソリューションは機能します (ただし、ERB がそれを処理することを認識できるように、.erb を JS ファイルの最後に追加することを忘れないでください...つまり、maps.js.erb)。

問題は、これは私が理解しているアセット パイプラインの哲学に反するということです。Rails は、意図的にすべての Javascript を 1 つのファイルに連結して、HTTP 要求のオーバーヘッドを節約します。ただし、さらに重要なことは、ブラウザーがこのファイルをキャッシュするため、要求ごとに再フェッチする必要がないことです。行われたリクエストに応じて JS ファイルを変更する変数がある場合、Rails はリクエストごとに JS ファイルを再処理する必要があり、コストがかかります。(CSS にも同じ概念が適用されることに注意してください)。

私が見つけた最善の解決策は、変数値をページに何らかの方法で配置することです。これは、すべての要求で動的に処理する必要がある 1 つのファイルであるためです。通常、私は人々がそれらを次のように隠しフォームに入れているのを見ます:

<%= content_tag :input, nil, :type => 'hidden', :id => "map-name-field", :'data-name' => @map.name %> 

私が使用した 1 つのアプローチは、名前やタイトルなど、そのページに固有のページ上の要素にそれを添付することです。

<%= content_tag :h2, @map.name, :id => "map-name", :'data-name' => @map.name %>

ページに表示されたら、JS 関数内からフェッチできます (ただし、ここで重要なのは、フェッチャー関数はマップのすべてのインスタンスで同じであるため、JS ファイルを変更または再処理する必要がないということです)。

// Assuming jQuery
// For the hidden input approach:
var mapName = $('#map-name-field').value
// or for the data-attribute approach:
var mapName = $('#map-name').attr('data-name')
于 2013-01-23T20:15:51.250 に答える