5

私はRails 3.2.9を使用しています。 /app/assets/javascriptsディレクトリにある.js.coffeeファイルにCoffeeScriptコードを追加すると、結果のJavaScriptがすべてのWebページに表示されます。だから私は定義する任意の方法は、私が他のファイルに書き込み、他のCoffeeScriptのコードには表示されません残りのRailsアプリケーションで使用できるCoffeeScript/JavaScriptクラスとメソッドのセット

(function() { 
    // my code 
}).call(this); 

:問題は、すべてのJavaScriptがでラップされています。 Railsで再利用可能なCoffeeScriptクラスとメソッドのセットを書く適切な方法は何ですか?

答えて

7

最も簡単なことは、すべてのクラスのネームスペースを作成することです。あなたのアプリケーションは、何が起こる前に、初期化コードで、その後、「アプリ」と呼ばれている場合:

// Set up the namespace. 
window.app = { } 

し、すべてのあなたの.coffeeのファイルに:

class app.Pancakes 
    #... 

その後、あなたはグローバル名前空間とあなたを持っていると思いますD」その名前空間を通じて、すべてを参照します。シンプルな機能のために同様に

pancakes = new app.Pancakes 

app.where_is = (pancakes, house) -> ... 

# And elsewhere... 
x = app.where_is(...) 

名前空間を設定する方法と部分的に隠す方法はいろいろありますが、これらはすべて上記のバリエーションです。単純な名前空間はRailsのアセットパイプラインでうまくいきます。

+0

名前空間を設定する適切な場所はどこですか? application.js?レイアウトビュー? –

+0

@at:最初にヒットした場所はすべて行います。私はそれが 'application.js'マニフェストファイルで生き残れるかどうかはわかりませんが、私はそれがそうすると思います。スクリプトタグの残りの部分の前にレイアウトに配置することもできます。 –

+0

'_my_stuff.js.coffee'のように、最初に' _'をつけたファイルを作成しました。こうすることで、他のものの前にロードされ、それに依存する他のコードの前に 'window.app = {}'を設定することができます。 –

4

また、あなたがこのようなCoffeeScriptのファイル内のクラスを定義することができます。

class this.Person 
    constructor: (attr = {}) -> 
    ... 

をそのようにして、定義がグローバル名前空間に接続されています。

+0

これは私が探していたものです。私はCoffeescriptを使って、すべてを 'window.name = name'で名前空間に入れることに本当に腹を立てました。私は一般にほとんどのアプリケーションでRails 4+を使用しています。そのため、Coffeescriptは主に私のケーキを氷結させています。 –

関連する問題