0

インスタンス変数を定義する controller#action があります。

@min_rating = 4

ビューには次のものがあります。

<%= javascript_tag do %>
  min_rating = <%= @min_rating %>
<% end %>

次に、Coffeescript で次の操作を実行できます。

jQuery ->
  alert min_rating

そして、そのビューのページにいる場合、正しく機能します。

ただし、別のビューを表示すると、var min_rating が定義されていないという JS エラーが表示されます。

Uncaught ReferenceError: min_rating is not defined 

これは、application.js 内のすべてのビューのすべての JS をロードするためです。

//= require_tree .

私の質問は、Rails でこれを処理する最善の方法は何ですか?

4

2 に答える 2

1

coffee スクリプトには var ステートメントがないため、coffee-script 内のすべての変数に対して自動的に挿入されます。これにより、コンパイルされた JavaScript バージョンがすべてをグローバル名前空間にリークするのを防ぐことができます。

そのため、コーヒー スクリプト側から意図的に何かをグローバル名前空間に「リーク」させる方法はないため、グローバル変数をグローバル オブジェクトのプロパティとして定義する必要があります。

attach them as properties on window

<%= javascript_tag do %>
  window.min_rating = <%= @min_rating %>
<% end %>

次に、coffeescript で min_rating にアクセスします。

于 2012-08-10T06:34:39.543 に答える
0

それはあなたの目標に依存します。簡単なオプションの 1 つは、参照する前に min_rating が JavaScript で定義されているかどうかを確認することです。

jQuery ->
  if typeof min_rating != 'undefined'
    alert min_rating

または、すべてのページで min_rating が定義されていることを確認できます。おそらく、その javascript_tag 呼び出しをデコレーターに移動し、デフォルト値にフォールバックすることによって可能です。それがアプリケーションにとって意味があるかどうかは、あなた次第です。

または、必要のないページで min_rating を参照するスクリプトをロードしないようにすることもできます。ただし、それは、すべてのページで同じ結合された JavaScript ファイルを使用できないことを意味します。

于 2012-08-03T23:20:59.863 に答える