トップ «前の日記(2015/03/26 (木) ) 最新 次の日記(2015/03/28 (土) )» 編集 RSS feed

HsbtDiary


2015/03/27 (金) [長年日記]

[ruby][rails] Rails 4.1 to 4.2 でハマったポイント

最近は OpenStack とかインフラ方面を色々やっていたけど、たまには Rails もキャッチアップしないとな〜と Rails アップグレードをさくっとやってみた。社内のいくつかのサービスを Rails 4.2.1 にしてみた所、いくつかのサービス共通でハマる箇所があったので紹介する。

controller/requests tests/spec の url path

Rails 4.1 までは

get "#{foo.url}/..."

のように、get で呼び出す url path の先頭に "/" を付けなくても動いていたけど、Rails 4.2 からは get "/#{foo.url}/..." というように明示する必要がある。どのサービスでも2-3つ、つけ忘れている物があってテストが落ちていた。

destroyed な record に update_column は使えない

Rails 4.2 では update_column に record が destroyed かどうかのチェックが入るようになったので、いわゆる >>> 論理削除 <<< なことを paranoia などでやっている場合に、論理削除状態の record を更新しようとすると raise してしまう。

論理削除状態なのに何で更新するんだよ!!1みたいな話もあるけど、ユースケースとしては

  • 何かしらのデータを削除するけど、ユーザーが何かしらの操作をすれば復活することができる
  • 復活操作をしない場合は一定期間後にレコードをマークして、バッチで物理削除する

みたいな時のマーク処理で死ぬことになる。

update_column では死ぬけど、update_attribute では死なないのでそっちに置き換えて何とかした。

destroyed な record や Time オブジェクトを ActiveJob に渡せない

ActiveJob integration を ActionMailer で使おうとしたときに、destroyed なレコードを渡してメールを送るだとか、時間を渡して何かしようとした時に、global_id のシリアライズで死んでしまって ActiveJob 経由でのメール送信を実行できない。これ仕様なんだろうけどユースケースとしてはかなり辛い。

しょうがないので delayed_job とかが提供している ActionMailer integration を使って回避した。

html 生成やタグの処理

html 生成時に id と href の順序が変わったとか、<br /><br> に strip されるようになったことで、生成される html をテストしている箇所がいくつか落ちていたので雑に直した。

url_for のインタフェースが変わった

ssl_requirements が url_for をモンキーパッチングしていて爆死した。しょうがないので、この機会に全部 force_ssl に書き換えることで問題そのものを無くした。

PS4 と Vita のアップデート

PS4 は 2.50, Vita は 3.50 が来ていたのでアップデートをしておいた。