51

インスタンス変数を設定しているRailsコントローラーがあります-

@user_name = "Some Username"

私の .slim テンプレートでは、コーヒー エンジンを使用して JavaScript を生成しており、クライアント側の JavaScript コードからユーザー名を出力したいと考えています。

coffee:
  $(document).ready ->
    name = "#{@user_name}"
    alert name

しかし、これは生成されているjavascriptですか??

$(document).ready(function() {
    var name;
    name = "" + this.my_name;
    alert(name);
}

CoffeeScript コードでコントローラーのインスタンス変数にアクセスするにはどうすればよいですか??

コーヒースクリプトを使用すると、haml にも同じ問題が発生すると推測されるため、これを haml としてタグ付けしています。

4

3 に答える 3

93

何が起こっているかというと"#{@user_name}"、これは、評価されて CoffeeScript ソースに挿入された Ruby コードとしてではなく、CoffeeScript として解釈されているということです。「Ruby 変数を CoffeeScript ソースに挿入するにはどうすればよいですか?」

簡単な答えは次のとおりです。これをしないでください。Rails チームは、3.1 のテンプレートに埋め込まれた CoffeeScript をサポートしないことを意図的に決定しました。これは、すべてのリクエストで CoffeeScript をコンパイルする必要があるため、パフォーマンスに大きなオーバーヘッドがあるためです (任意の文字列をソースに挿入できるようにした場合に必要になる)。 .

私のアドバイスは、Ruby 変数を純粋な JavaScript として個別に提供し、CoffeeScript からそれらの変数を参照することです。

javascript:
  user_name = "#{@user_name}";
coffee:
  $(document).ready ->
    name = user_name
    alert name
于 2011-11-13T00:34:45.400 に答える
32

私はどんな犠牲を払ってもインラインJavaScriptを避ける傾向があります。

JavaScriptから使用する変数をHTMLに格納するための優れた方法は、HTML5のデータ属性を使用することです。これは、JavaScriptを邪魔にならないようにするのに理想的です。

于 2011-11-13T14:12:58.390 に答える
2

以下を使用することもできます。

$(document).ready ->
  name = <%= JSON.generate @user_name %>
  alert name

これは、JSONが JavaScript のサブセットであるためです。

于 2012-09-12T21:44:32.330 に答える