你如何在Rails 3.1中用Sprockets编写DRY,模块化coffeescript?

nfm*_*nfm 15 ruby-on-rails coffeescript javascript-namespaces ruby-on-rails-3.1 sprockets

我正处于尝试编写一些合理的Javascript的早期阶段.我想基本上命名我的应用程序名称下的所有东西以尽可能避免全局变量,但仍然给我一种方法来访问在该地方声明的函数.但是,我不想在我的函数定义中超级冗长.

我理想的CoffeeScript会是这样的:

class @MyApp
  @myClassMethod = ->
    console.log 'This is MyApp.myClassMethod()'

  class @Module1
    @moduleMethod = ->
      console.log 'This is MyApp.Module1.moduleMethod()'
Run Code Online (Sandbox Code Playgroud)

你得到了照片.这样我就可以避免在MyApp.Module.submoduleMethod = ->每次想要正确定义命名空间函数时编写- 我的类定义中使用@和定义事物可以保持简洁.

这一切都很顺利,直到我想将我的功能分成多个CoffeeScript文件.然后我真正想要的是这样的:

// application.js
class @MyApp
  //= require 'module1'
  //= require 'module2'

// module1.js
class @Module1
  @moduleMethod = ->
    console.log 'This is STILL MyApp.Module1.moduleMethod()'
Run Code Online (Sandbox Code Playgroud)

似乎Sprockets不能做到这一点.

是否有一种明智的方法可以将我的CoffeeScript文件放在容器文件中的正确位置?或者另一种方法来编写使用CoffeeScript,Sprockets和Rails 3.1划分为单独文件的模块化代码?

bra*_*ing 3

我有一个在代码中使用的模块解决方案。

我定义我的模块如下

@module "foo", ->
    @module "bar", ->
        class @Amazing
            toString: "ain't it"
Run Code Online (Sandbox Code Playgroud)

惊人的是可用的

foo.bar.Amazing
Run Code Online (Sandbox Code Playgroud)

@module 助手的实现是

window.module = (name, fn)->
  if not @[name]?
    this[name] = {}
  if not @[name].module?
    @[name].module = window.module
  fn.apply(this[name], [])
Run Code Online (Sandbox Code Playgroud)

它写在 Coffeescript 网站上。

https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript