5

Ich verwende Rails 3.2.9. Wenn ich CoffeeScript-Code zu einer .js.coffee-Datei im Verzeichnis /app/assets/javascripts hinzufüge, erhalte ich das resultierende JavaScript auf allen meinen Webseiten. Das Problem ist, alle JavaScript in gewickelt ist:Set von CoffeeScript/JavaScript-Klassen und Methoden für den Rest der Rails App

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

So alle Methoden, die ich definieren, sind nicht sichtbar in jedem anderen Coffeescript Code, den ich in anderen Dateien schreiben. Was ist der richtige Weg, um eine Reihe wiederverwendbarer CoffeeScript-Klassen und -Methoden mit Rails zu schreiben?

Antwort

7

Am einfachsten ist es, alle Klassen zu benennen. Wenn Ihre Anwendung „app“, dann in Ihrem Initialisierungscode aufgerufen wird, bevor irgendetwas anderes passiert:

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

und dann in alle Ihre .coffee Dateien:

class app.Pancakes 
    #... 

Dann würden Sie einen globalen Namensraum haben, und Sie ‚d verweisen alles durch diesen Namensraum:

pancakes = new app.Pancakes 

Ähnliches gilt für einfache Funktionen:

Es gibt verschiedene Möglichkeiten, den Namespace einzurichten und teilweise zu verbergen, aber es handelt sich dabei alle um Variationen des oben genannten Namens, und der einfache Namespace spielt gut mit der Rails-Asset-Pipeline.

+0

Wo ist der richtige Ort, um den Namespace einzurichten? Anwendung.js? die Layoutansicht? –

+0

@at ​​.: überall, wo zuerst getroffen wird, wird es tun. Ich bin mir nicht sicher, ob es in einer 'application.js'-Manifestdatei überleben wird, aber ich würde vermuten, dass es das tun würde. Sie könnten es sogar in Ihr Layout vor den restlichen Skript-Tags einfügen. –

+0

Ich habe am Anfang eine Datei mit einem _ _ erstellt, wie '_my_stuff.js.coffee'. Auf diese Weise ist es vor allem anderen geladen und ich kann 'window.app = {}' vor dem anderen Code setzen, der davon abhängt. –

4

Auch Sie Klassen in den Coffeescript-Dateien wie folgt definieren:

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

Auf diese Weise werden die Definitionen zu den globalen Namensraum angebracht.

+0

Das ist etwas, nach dem ich gesucht habe. Ich war wirklich genervt, dass ich bei Coffeescript alles mit 'window.name = name' benannt habe. Ich benutze Rails 4+ für die meisten Anwendungen, also ist Coffeescript für mich das Sahnehäubchen, und das hat meinen Tag gemacht! –