3

私は最近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()

4

1 に答える 1

4

MyObjectのコンテンツをページに含めれば、pages.js絶対に存在します。おそらく追加する必要があります

<%= javascript_include_tag "pages" %>

HTMLに追加するか、設定しないでください

config.assets.precompile += %w( pages.js )

代わりに以下を追加しますapp/assets/javascripts/application.js.coffee

//= require pages

withapplication.jsに含まれていることを確認してくださいapp/views/layouts/application.html.erb

<%= javascript_include_tag "application" %>

アセット パイプラインに関する Rails ガイドは非常に役に立ちますここで少し説明を加えると...

Rails では、application.js本番環境にデプロイするときに、(デフォルトで) すべての JavaScript を 1 つのファイルにパックする必要があります。Sprockets を使用すると、上記のような require ディレクティブを追加して、ファイルにリストされているapplication.jsファイルを検索、インクルード、およびコンパイルできます。

デフォルトでは、Rails は、、、application.jsおよびapplication.cssの非.js/.cssファイルのみをコンパイルします。つまり、ファイルにディレクティブを追加しない限り、Rails はそれを無視します。app/assetslib/assetsvendor/assets//= requirepages.jsapplication.js

pages.jsでコンパイルするファイルのリストに追加しようとしたのはそのためですconfig.assets.precompile。これにより、そのファイルをコンパイルするよう Rails に明示的に指示され、次のような JavaScript インクルードを通じて利用できるようになります。

<%= javascript_include_tag "pages" %>

HTMLに入れていないと思います。通常、このルートをたどることは、いくつかの理由であなたの好みではありません。そのうちの 1 つは、そうすることで、Rails が提供しようとしているアセット パイプライン ラインの助けに「感謝しない」と言っているということです//= require

したがって、どちらの方法も実行可能です。pages.jsのコンテンツをページに含めるために必要なすべての手順をまだ実行していないため、MyObjectが存在しません。

于 2012-08-31T19:02:39.487 に答える