2011-11-13 6 views
48

スリムテンプレート内のCoffeeScriptエンジンでインスタンス変数にアクセスする方法 - 私はJavaScriptを生成するために、コーヒーのエンジンを使用しています私の.slimテンプレートで私はRailsのコントローラここで私はインスタンス変数に設定していてい

@user_name = "Some Username" 

をクライアントシェアのjavascriptコードからユーザー名を印刷したい -

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

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

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

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

私はhamlがCoffeeScriptを使用しているときに同じ問題があると推測しているので、これをhamlとしてタグ付けしています。

+1

@Thiloいいえ、彼はRuby変数 '@ user_name'を注入しようとしています。 RubyとCoffeeScriptは同じ文字列補間構文を使用します。 –

+1

私は参照してください。ところで、 "#{@ user_name}" 'から' this.my_name'に変数名がどのように変わるのでしょうか? – Thilo

+0

coffeescriptのため、@propはthis.propにコンパイルされます –

答えて

86

"#{@user_name}"はCoffeeScriptソースとして評価され注入されたRubyコードではなく、CoffeeScriptとして解釈されます。あなたは、 "Ruby変数をCoffeeScriptソースにどのように注入するのですか?"

短い答えは:これをしないでください。 Railsのチームは、3.1のテンプレートに埋め込まれたCoffeeScriptをサポートしないことを意図的に決めました。なぜなら、あらゆる要求に対してCoffeeScriptをコンパイルしなければならないためにパフォーマンス上のオーバーヘッドが発生するからです(任意の文字列をソースに注入する場合、 。

私のアドバイスは、私はすべてのコストでのインラインJavaScriptを避ける傾向にある例えば、純粋なJavaScriptなど別途ごRubyの変数を提供して、あなたのCoffeeScriptからこれらの変数を参照するために:

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

お返事ありがとうございますので、基本的にあなたが示唆していることは、パフォーマンスの観点からは大丈夫ですか? – kapso

+2

Slimは、すべての要求に対してテンプレート内のCoffeeScriptを再コンパイルするかどうかによって異なります。私は正直には分かりません。とにかくそれを外部ファイルに移動する必要があります。 JSに一度だけコンパイルされ、ブラウザがそれをキャッシュします。 –

30

です。

HTMLに変数を格納し、JavaScriptから使用するには、HTML5データ属性を使用するのが良い方法です。これはあなたのJavaScriptを目立たないように保つのに理想的です。

+0

これは、JavaScript MVCを使用していて、サーバーへの複数のHTTP要求を避けたい場合に役立ちません。 http://backbonejs.org/#FAQ-bootstrap – jackyalcine

+0

javascriptのMVCを使用している場合、ほとんどの場合、データを取得するためにajaxリクエストを行い、クライアントのhtmlをレンダリングします。しかし、たとえば、一般的な設定パラメータは、html/body/containerのデータ属性で一度送信できます。 – nathanvda

+0

真、真。私が非常に発疹から来たら申し訳ありません! – jackyalcine

2

また、使用することができます

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

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

+1

これは、ハードbarfs。または、少なくともDashingの.coffeeファイル内にあります。 –

関連する問題