koukiblog

たぶんweb系の話題

Asset PipelineのPreCompile対象とその設定

いつも忘れては調べて思い出して。。を繰り返していたのでいいかげん覚えようと思ってメモっておく

  • precompile対象のファイル

デフォルトでは
JS:
app/assets/application.js
CSS:
app/assets/application.css
となっている。

つまり、デフォルトの設定は、アプリケーションでjs,css共に1ファイルになるべきという考え方になっていて
どの画面でもコンパイル後のapplication.js,application.cssで動くようにしないといけない。
( // require_tree . がついてるので、コントローラー毎のJSを1ファイルに結合して使用する形になる)

気をつけないといけないのが、特定の画面で、特定のJSだけを読み込もうとして

 <%= javascript_include_tag params[:controller] %>  

みたいに書いていた場合、
production環境で実行すると、下記のようなエラーが発生して、レンダリングすら行われない

ActionView::Template::Error (XXXXXXX.js isn't precompiled):
    40:     <!-- Javascripts
    41:     ================================================== -->
    42:     <!-- Placed at the end of the document so the pages load faster -->
    43:     <%= javascript_include_tag params[:controller] %>
    44:   </body>
    45: </html>

前述の通り、コンパイルされるのは、application.jsだけなので、production環境では、ファイルが見つからずエラーになる。

  • precompile対象の設定

設定を追加することで、precompile対象を追加することができる
/config/enviroments/production.rb内の

config.assets.precompile 

に追加でおk。

基本的には、JSは1ファイルにまとめても動くように作って、必要に応じて追加するのがよいのかな。
管理画面用のJSは別で切り出すとかありそうだし。

RSpecで常に--format documentation にする

アプリケーションルートに、.rpsec という名前でファイルを作成し、
ファイル内にデフォルトで使用したいオプションを記載すればok

--color
--format documentation

てしとくと、たいていの場合いいんじゃないのかな。

Railsの場合、rspec-railsrspec:installで、.rpsecファイルは作成されてるみたいです。

Gemfile.lockをバージョン管理すべきか

http://langturn.com/translations/33?locale=ja

bundlerの作者によると
・gem開発時にはいらない
・アプリ開発時には必要
ということらしい。

bundle installを実行することで、Gemfile.lockが生成され、そのファイルを配布することで
どの環境でも同じgemの依存環境が再現できる。という内容。

現在の僕の運用だと、Gemfile.lockは毎回生成したのだけど、あまりおすすめされない方法らしい。
理由は、developmentでしか必要ないgemをproduction環境に入れたくなかったから。(rspecとかsqliteとか)
デプロイするたびに、

bundle install --without development test

してたのだけど、どうしようかなぁ。

nginxから返したコンテンツで、cssが全く適用されない

CSSファイルはちゃんとレスポンス出来ていて、中身も問題ない。
けど、なぜかブラウザがcssとして認識してくれない。
という感じで、なんでだろーて感じだったのですが、
よーく見るとレスポンスのMINETYPEがtext/plain。。

nginx.confで、mine.typeをincludeして解決