web-dev-qa-db-ja.com

Rails 3.1アセット-開発における奇妙なサービス

Rails 3.1アセットパイプラインに問題があります。アセットは開発に2回含まれています:

<script src="/assets/main_new.js?body=1" type="text/javascript"></script>
<script src="/assets/pagenav.js?body=1" type="text/javascript"></script>
<script src="/assets/tours.controller.js?body=1" type="text/javascript"></script>
<script src="/assets/tours.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

Railsはどういうわけかコンパイルしてapplication.jsをインクルードするので、すべてのスクリプトは個別のファイルとして、そしてアプリケーションに2回インクルードされます。 js

本番環境でプリコンパイルされたアセットを使用すれば、すべて問題ありません。

development.rb

 config.assets.compress = false
 config.assets.debug = true

production.rb

# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false

# Compress both stylesheets and JavaScripts
config.assets.compress = true
config.assets.js_compressor  = :uglifier
config.assets.css_compressor = :scss

config.assets.compile = false
config.assets.digest = true

application.rb

config.assets.enabled = true
36
Fenelon

以下をdevelopment.rbに追加してみてください。

config.serve_static_assets = false

...そしてブラウザのキャッシュをクリアします(コメントに基づいて更新

静的アセットとは、パブリック/アセット内のプリコンパイル済みアセットを指します。ここで、rake assets:precompileそれらを置きます。

何が起こっているのかというと、パブリック/アセットに存在するものはすべて、アプリ/アセットにサービスを提供している場合はそれを上書きします。したがって、jsタグがapp/assets/application.jsを識別しようとしているときに、public/assets /application.jsがロードされます。

39
Ethan McCutchen

/ public/assetsを削除したら、ブラウザのキャッシュもクリアする必要があります。

12
Effisfor

これは私に問題を引き起こしました。次のように設定すると、アプリは機能しますが、単一のapplication.jsファイルが含まれます。これは開発には必要ありません。

config.serve_static_assets = false

以前にアセットをプリコンパイルしました(原因のようです)。

それを修正するために、私は次のことをしました:

  • 以前のプリコンパイルで追加されたpublic/assetsディレクトリを削除します。
  • 実行Rails_ENV=development rake assets:clean tmp/assetsをクリアします
  • 編集されたapp/assets/application.js

Application.jsを編集した後で初めてエラーが発生し、ページに含まれているapplciation.jsが完全なプリコンパイル済みのapplication.jsではなかったことが修正されました。

これらすべてを行う必要があるかどうかはわかりません。また、途中でサーバーを再起動していました。

8
Peter

これによって(まだ)つまずきました-//= requireの最後にあるすべてのapplication.jsディレクティブの後に、空白行を追加することを忘れないでください!

4
tw airball

より少ないファイルで同じ問題を追加します。

ここから ドキュメント

開発モードでは、アセットはマニフェストファイルで指定された順序で個別のファイルとして提供されます。

私の解決策は、*= require_tree .からapplication.css.less行を削除し、lessから@import "my-styles";のみを使用することでした。

たぶんあなたはjavascriptで同様の解決策を見つけることができます...

0
Charles