amakanをRails 5に移行した
amakanでRuby 2.3.3を使うようにした - ✘╹◡╹✘ に引き続き、amakan に改善を加えた。
Rails 4.2.6 で動いていた https://amakan.net/ を Rails 5.0.0.1 に移行した。前回 Ruby 2.3.3 に移行したという記事で、「Rails 5 にすれば Ruby 2.4.0-preview3 が使えるのにな」という話をしたのでその伏線回収。
4.2.6 → 4.2.7
とりあえず 4.x 系で最新の 4.2.7 にアップデートすることに。これは特に問題がなかった。
rails app:update
Rails 5.0.0.1 に変更すると、rails app:update
が実行できるようになる。これを実行すると、幾つかのファイルが追加・上書きされる。そこまで変更量も多くないので、手作業で必要な変更だけ精査して取り入れた。
quiet_assets
開発環境での静的ファイル配信時のログを抑制するために quiet_assets という gem を利用していたものの、これは Rails 5 に同等の機能が含まれることになったので取り除いた。
rails_12factor
本番環境でのログの出力先を標準出力に変更するために rails_12factor (に含まれる rails_stdout_logging) という Gem を使っていたが、Rails 5 から必要なくなったので外した。
sass-rails
Rails 4 でつくった雛形の Gemfile では sass-rails のバージョンが ~> 5.0
に固定されていたが、これだと Rails 5 の依存と噛み合わないのでこのバージョン指定を外すことにした。
sinatra
rack のバージョンが上がったことで rack/showexceptions.rb
というファイルが rack/show_exceptions.rb
というファイル名に変わっていることに起因して、それを利用している Sinatra のバージョンを 2.0.0.beta2 に変更した。
autoload
Rails 4 以前は Rails.configuration.autoload_paths
以下のディレクトリが本番環境で eager_load されるようになっていたが、Rails 5 からは何もしなければ eager_load も autoload もされないようになった。この挙動を戻すために、Rails.configuration.enable_dependency_loading = true
を設定した。
ActiveRecord
Rails 5 での大きな変更点として、ActiveRecord の挙動の変更がある。デフォルトの挙動が変わっただけで、設定次第で前と同じ挙動にもできるが、この機会に実装側を変更した。その他にもいろいろあって、結果的に以下の変更に対応した。
- callback で false を返しても中断しなくなった
- 基底クラスとして ApplicationRecord を利用する慣習になった
- uniq が非推奨になり、distinct が推奨されるようになった
- belongs_to の関連先がデフォルトでは必須になった
また一見気付きづらい変更の1つに、ActiveRecord の enum の変更がある。
class Book \< ApplicationRecord enum( category: %i( comic light\_novel business ... ) ) end
Rails 4 以前では、こういう挙動をしていた。
Book.first[:category] #=\> 0
Rails 5 以降では、こういう挙動になる。
Book.first[:category] #=\> "comic" Book.first.category\_before\_type\_cast #=\> 0
おわり
これでデプロイして一通り終了した。amakan はそこまでコードも無いので、Rails 5 への移行は全体を通して30分ぐらいで完了した。業務でも変更しているし、他のアプリでも何度も変更しているので、あまり高揚はないかも。しかしめでたいのでハーゲンダッツの1番いいやつを買いました。こういう、節目節目の出来事をきちんと喜ぶ気持ちを大切にな…。Rails アップデートしたいので手伝ってほしいという話があれば twitter などで雑に声をかけてください。Rails 2.0.2 以降からのバージョンアップであれば一応何度かやった経験がある。
次回は Ruby 2.4.0-preview3 に移行するかも。