読者です 読者をやめる 読者になる 読者になる

koukiblog

たぶんweb系の話題

Asset PipelineのPreCompile対象とその設定

Rails

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

  • 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は別で切り出すとかありそうだし。

homebrewで入れたruby-buildを最新にする

brew upgrade --HEAD ruby-build

でokでした。

ふと brew update してみたら、gitのコンフリクト起きてたのですが見なかったことにしました。
(また今度時間あるときに解決する。。)

RSpecで常に--format documentation にする

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

--color
--format documentation

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

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

irbでRSpecのmatcherを試す

irb内でさくっと試したくなったので。

require 'rspec'
include Rspec::matchers

true.should be_true 

Mockを試す場合は

require 'rspec/mocks/standalone'

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して解決

Railsのユニットテスト時にDBの変更が反映されない

Rails

しばらく悩んでしまったのだけど
ユニットテスト時のDBが更新されてないだけだった。。

rake db:migrate RAILS_ENV="test"

して解決

この辺うまくやってくれるgemとかあるのかなー