読者です 読者をやめる 読者になる 読者になる

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 の挙動の変更がある。デフォルトの挙動が変わっただけで、設定次第で前と同じ挙動にもできるが、この機会に実装側を変更した。その他にもいろいろあって、結果的に以下の変更に対応した。

  1. callback で false を返しても中断しなくなった
  2. 基底クラスとして ApplicationRecord を利用する慣習になった
  3. uniq が非推奨になり、distinct が推奨されるようになった
  4. belongs_to の関連先がデフォルトでは必須になった

また一見気付きづらい変更の1つに、ActiveRecordenum の変更がある。

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 に移行するかも。