私は最近CoffeeScriptについて考えていて、このガイドに従って、作業中のRailsプロジェクトをRails 3.2.8(アセットパイプラインがなかったRails 3.0.9から)にアップグレードしました。
私は物事を適切に機能させるためにいくつかのハックなことをしなければなりませんでした。新しいページ「/pages/ game」をテストしているので、アセットディレクトリにCoffeeScriptの例がいくつかあります。
(app / Assets / javascripts / page.js.coffee)
class MyObject
constructor: ->
hello: -> alert 'hello world of coffeescript!'
a = new MyObject
a.hello()
次に、本番環境に次の行を追加しました:(config / environment / Production.rb)
config.assets.precompile += %w( pages.js ) # this is needed to precompile coffee script files... it is difficult to understand how manifest files work...
次に入力します
$ bundle exec rake assets:precompile
page.jsをコンパイルするために働いた唯一の問題は、CoffeeScriptで作成したクラスが期待どおりに機能しないことです。そこで、FireFoxで開発者コンソールを開き、クラスを手動でインスタンス化しようとしましたが、MyClassという名前のそのようなオブジェクトがないように動作しました。
それで、私はどこで間違ったのですか?CoffeeScriptで書いたクラスを手動でインスタンス化できると思い込んだのは私にとって思いがけないことでしたか?プリコンパイル配列にpages.jsを追加するという私のハックな手段は不適切でしたか?CoffeeScriptのプロの場合、クラスなどをどのようにテストしますか?
更新: 私の問題の一部は、コーヒースクリプトクラスに固有の「可変プライバシー」でした。このプライバシーは標準のJavaScriptで実装でき、コーヒースクリプトに手を出す前に理解しておく必要があります。 http://benalman.com/news/2010/11/immediately-invoked-function-expression/
そうは言っても、次のように、グローバルにアクセスできるようにするには、Coffeeスクリプトクラスをウィンドウオブジェクトにアタッチする必要がありました。
修正済み
class MyObject
constructor: ->
hello: -> alert 'hello world of coffeescript!'
window.MyObject = MyObject;
クラスがこのマナーで公開されると(グローバルとしてウィンドウにアタッチすることにより)、を介してインスタンス化さa = new MyObject()
れ、通常どおりに呼び出されて画面にアラートを出す関数を使用できます。a.hello()