いつもtmixをご利用いただき、ありがとうございます。tmixのRailsアップグレードを担当しているうなすけです。 4月にRailsのバージョンを4.0に上げた記事を書きましたが、その時点でRails 4.2がリリースされていたのはご存知かと思います。 時代に乗り遅れたくない!ということで、またまた僕がtmixのRails 4.1対応をすることにしました。
アップグレード作業
gemのバージョンを上げる
まずはrails 4.1をインストールしないことには始まりません。
gem 'rails', '4.1.11'
さて、この頃、世間ではbundlerのversion 1.10による新機能、BUNDLED WITH
について話題になっていました。ちょうどいいやという気持ちになり、おもむろに
$ gem update bundler $ bundler -v Bundler version 1.10.4
と実行して、bundlerのバージョンを上げてしまいました。
synvert
前回に引き続き、synvertのお世話になりました。
$ gem install synvert $ synvert --sync $ synvert --run rails/upgrade_4_0_to_4_1
今回、文法の修正こそありませんでしたが、新しくconfig/secrets.yml
ができました。秘密にしておきたいトークン達は、ここにまとめることになったようです。
ここに記述する長い文字列は、各環境(development、staging、productionなど)ごとに必要になるようですが、既存のRailsアプリケーションを4.1にアップグレードする際には新しく生成する必要が出てくるかもしれません。tmixでも必要になったので、以下のコマンドで生成しました。
$ bundle exec rake secret
セッションシリアライズ方式の変更
カタカナで書かれるとなんのこっちゃとなるかもしれません。今までのRailsは、セッションのデータをRubyオブジェクトをMarshal(Rubyのオブジェクトを文字列に書き出す方式)によってシリアライズしていました。これが、Rails4.1ではJSON形式でシリアライズするのが標準になりました。
その設定が、config/initializers/cookies_serializer.rb
に以下のように記述されています。
Rails.application.config.action_dispatch.cookies_serializer = :json
ですが、いきなり全てJSONでやりとりさせるようになると動かなくなる部分も出てきます。なので、以下のように指定して、Marshalしなければいけない部分はそのままに、JSONで出来る部分はJSONで処理を行うよう変更しました。
Rails.application.config.action_dispatch.cookies_serializer = :hybrid
outdated syntaxの書き換え
前回アップグレード時にfixできなかったoutdated syntaxがまだ残っており、エラーが出ていました。.find(:all)
や.find(:lock => true)
などが残っており、それぞれ.all
や.lock(true)
に置き換えました。
また他にも、Activerecord::Relationからmap!
などのミューテーターメソッドが含まれなくなった(本家PullRequest)ことによるエラーも発生したので、.to_a
を挟むようにしました。
リリース
今回は、前回の3系から4系に上げる変更よりは軽微なので、確認、リリースも普段のリリースと同様に開発者のみで行いました。前回同様に目に見える変化はありませんが、tmixは確実に、着実に新しく変化しています。
アップグレードを振り返って :ok_cat:
今回のRailsアップグレードは、前回の「Rails4.0に上げてね」とお願いされた形ではなく、自分から「やるぞ!」と思って作業をはじめました。今後のtmixの戦力として活躍できるように、自分から進んでやりたいことをどんどんやっていこうかと思います。次はRails 4.2にするぞ!!!