0

TLDR:Quelle est la meilleure façon de séparer les préoccupations de CoffeeScript et de Ruby on Rail?

Que pouvez-vous faire pour combiner plusieurs fichiers CoffeeScript dans un fichier JS, dans RoR, le tout sous le même bloc fonctionnel anonyme?

Version longue:

J'ai quelques fichiers CS qui seront chargés pour une partie d'une application web RoR. Je me demande: quelle est la bonne façon de séparer les préoccupations de CoffeeScripts et de Ruby on Rail 3.1?

Utilisons ce qui suit comme un exemple de code:

main.js.coffee

window.MyApp = {} # to escape the CoffeeScript anonymous function block 
# (I like the anonymous function block because it protects my other 

MY_GLOBAL_SETTING = "world!" 
$.click "#my_button" myApp.sayHello 
# (I could use something like goog.bind here instead of using myApp. Any suggestions? Fat arrow?) 

hello.js.coffee

MyApp.sayHello = sayHello() -> 
    doComplicatedStuff() 
    alert("Hello #{ MY_GLOBAL_SETTING }") 

complicated.js.coffee

doComplicatedStuff =() -> 
    # some really complicated algorithm, for example 
    true 

J'ai mon actif répertoire structuré comme les suivants:

assets/ 
    application.js 
    application/ 
    # javascript that gets used with the main application 
    secondary_page.js 
    secondary_page/ 
    complicated.js.coffee 
    hello.js.coffee 
    main.js.coffee 

secondary.js

//= require secondary_page/main.js.coffee 
//= require secondary_page/complicated.js.coffee 
//= require secondary_page/hello.js.coffee 

j'ai utilisé pour compiler les fichiers ainsi que CoffeeScript dans le cadre du processus de construction , mais maintenant je veux utiliser le pipeline d'actifs à la place. Je bois le RoR 3.1 kool-aid! Haha, sérieusement, le pipeline d'actifs semble impressionnant.

Le problème que je rencontre est que secondary.js ressemble à ce qui suit:

(function() { 
    // main.js 
).call(this); 
(function() { 
    // complicated.js 
).call(this); 
(function() { 
    // hello.js 
).call(this); 

Cela empêche les variables locales d'être partagées entre l'ensemble du code . MY_GLOBAL_SETTING et doComplicatedStuff ne sont pas disponibles pour dire Bonjour.

Alors ... que dois-je faire? Je ne peux pas penser à un bon moyen sans introduire à nouveau ma propre étape de compilation personnalisée.

Répondre

2

Ceci est une question commune pour les développeurs Rails commencent à utiliser CoffeeScript. Voir, par exemple:

Solutions abondent.Le plus simple est de préfacer les déclarations de variables que vous voulez être visibles en dehors d'un fichier particulier avec @, puisque le this pointera sur window dans le contexte le plus extérieur de chaque fichier, et x pointe sur window.x lorsqu'aucun x local n'est défini.

0

Probablement la meilleure façon de le faire est de les laisser dans leurs propres étendues anonymes, mais d'exporter les fonctions individuelles dont vous avez besoin d'accéder à partir d'autres modules. De Trevor Burnham Coffeescript book, il vous recommande de faire ce (qui fonctionne dans le noeud et les navigateurs):

root = global ? window 
root.exportableFunction = exportableFunction 
root.MY_GLOBAL_SETTING = some: 'Setting' 
Questions connexes