最近は OpenStack とかインフラ方面を色々やっていたけど、たまには Rails もキャッチアップしないとな〜と Rails アップグレードをさくっとやってみた。社内のいくつかのサービスを Rails 4.2.1 にしてみた所、いくつかのサービス共通でハマる箇所があったので紹介する。
Rails 4.1 までは
get "#{foo.url}/..."
のように、get で呼び出す url path の先頭に "/" を付けなくても動いていたけど、Rails 4.2 からは get "/#{foo.url}/..."
というように明示する必要がある。どのサービスでも2-3つ、つけ忘れている物があってテストが落ちていた。
Rails 4.2 では update_column に record が destroyed かどうかのチェックが入るようになったので、いわゆる >>> 論理削除 <<< なことを paranoia などでやっている場合に、論理削除状態の record を更新しようとすると raise してしまう。
論理削除状態なのに何で更新するんだよ!!1みたいな話もあるけど、ユースケースとしては
みたいな時のマーク処理で死ぬことになる。
update_column では死ぬけど、update_attribute では死なないのでそっちに置き換えて何とかした。
ActiveJob integration を ActionMailer で使おうとしたときに、destroyed なレコードを渡してメールを送るだとか、時間を渡して何かしようとした時に、global_id のシリアライズで死んでしまって ActiveJob 経由でのメール送信を実行できない。これ仕様なんだろうけどユースケースとしてはかなり辛い。
しょうがないので delayed_job とかが提供している ActionMailer integration を使って回避した。
html 生成時に id と href の順序が変わったとか、<br />
が <br>
に strip されるようになったことで、生成される html をテストしている箇所がいくつか落ちていたので雑に直した。
ssl_requirements が url_for をモンキーパッチングしていて爆死した。しょうがないので、この機会に全部 force_ssl に書き換えることで問題そのものを無くした。
PS4 は 2.50, Vita は 3.50 が来ていたのでアップデートをしておいた。