怖話をruby1.8.7 & rails3.0.8からruby1.9.2 & rails3.1.1の最新状態に更新しました。引っかかったところメモ。
yamlのエラー
$ rake db:migrate
rake aborted!
couldn't parse YAML at line 267 column 42
rake db:migrate
がエラー。
require 'yaml'
YAML::ENGINE.yamler= 'syck'
config/boot.rbの2行目に下記を追加。
require 'yaml'
YAML::ENGINE.yamler = 'syck'
日本語
db/seeds.rbで日本語を使ってたので先頭に下記magick commentを追加。
# coding: utf-8
何でもかんでもmagick commentを入れるのは良くないので必要なところにだけ。rubyのm17nは素晴らしいと思います。
Array#choice
ruby1.9.2ではArray#choiceが無くなってる。Array#sampleを使えばいい。
Fixtures
FixturesがActiveRecord::Fixturesになりました。
db/seeds.rbでfixtureを読み込む場合(test用のとは別に用意してる場合とか)
require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/db/seed", 'stories')
こんな感じだったんですが、
require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/db/seed", 'stories')
こうなりました。
Asset Pipeline
developmentで余裕こいてるとproduction世界でひっそり幕を閉じる。(via ブロントさん)
Asset Pipelineを大きく下記の4つに分けて考えるとわかりやすいです。
- preprocessing(coffee -> jsなど)
- concatenation(複数のファイルを一つにする)
- compression(圧縮)
- fingerprinting(ファイル名にハッシュ値を付ける)
対象は下記3つ
- javascript
- stylesheet
- image
productionではrake assets:precompile
で上記4つを対象3つに施してpublic/assetsフォルダーに入れ、nginx等のWebサーバーに配信させてrailsは関与しません。アプリ起動前からpublic/assets以下に必要な全てのファイルが揃って準備完了している必要があります。
precompileされるにはファイルがsprocketsの記法= require tree .
等やconfig.assets.precompile += %w()
のリストに入ってる必要があります。ここから漏れているファイルはpublic/assetsに無いことになるので表示されません。
jsの中でひっそり使われてる画像や特定のページでだけ読み込んでるcss、そういえば使ってたjqueryプラグインなど、とても見落としやすいので気を付けなければなりません。
それを乗り越えればnginxでcache期限無限のフィーバー状態です。でも既存アプリのバージョンアップなどでは上記見落としを無くすのはとても難しいと思います。もし見逃しそうならば・・・
config.assets.compileをtrueにするんだな。
おまえにもかぞくがいるだろう…