Rails 5へのアップデート


Rails 4系からRails 5へのアップデートに関してのTipsです。

Rails アップグレードガイド | Rails ガイド

😀 アップデートタスク

Rails 5にGemをアップデートした後にrails app:updateコマンドを実行するとconfig/environemets/bin/配下のファイルかどが新しいバージョンのファイルを作成、既存ファイルの更新を行います。

rails app:update

🐝 Rubyの部分の変更

Active RecordはApplicationRecordを継承

Model(Active Record)はApplicationRecordを継承する形になります。

class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
  • self.abstract_class=true : 抽象クラスを表す。対応するテーブルがない場合の設定

Active JobはApplicationJobを継承

Active JobではApplicationJobを継承するように変更されました。

class ApplicationJob < ActiveJob::Base
end

Action MailerはApplicationMailerを継承

Action MailerはApplicationMailerを継承するようになりました。

class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end

Controllerのparamsがオブジェクトに変わった

Controllerのparamsがハッシュからオブジェクトを返すように変わりました。
paramsをハッシュ前提にしているメソッドがあった場合は明示的にハッシュに変換する必要があります。

params.permit([:proceed_to, :return_to]).to_h

belongs_toは関連付けがない場合はバリデーションエラー

Active Recordのbelongs_toは関連付け(association)が存在しない場合はバリデーションエラーを返すようになりました。
この機能は関連付けごとにoptional: trueを指定してオフにできます。

before_saveなどのCallbackのロールバック

Rails 4.2まではbefore_saveなどのActive Recordのコールバックでfalseを返すとロールバックされましたが、Rails 5.0からはthrow(:abort)で明示的にロールバックをする必要があります。

class Article
before_save def check_publishable?
throw(:abort) unless publishable?
end
end

🚜 テストに関する変更

Railsコントローラのテスト

assignsメソッド、assert_templateメソッドはGem rails-controller-testing
に切り出されました。これらのメソッドを使う場合はこちらのgemを追加してください。

🍣 設定に関する変更

本番環境ではautoload(自動読み込み)が無効

app配下は自動読み込みされますがそれ以外のlibなどに定義したクラスは自動で読み込まれません。
次の対策があります。

  • 明示的にrequireを行う
  • ディレクトリをapp/に移動する(lib/ => app/lib)
  • Rails.application.config.enable_dependency_loading=trueにする(autoloadを有効にする)

OriginチェックによるCSRF対策

CSRF防御の一貫として、「HTTP Originヘッダ」によるサイトの出自のチェックができるようになりました。

config.action_controller.forgery_protection_origin_check = true

サブドメインでのHSTSを有効にするオプション

サブドメインでHSTS(HTTP Strict Transport Security)を有効にするオプションが追加されました。

config.ssl_options = { hsts: { subdomains: true } }

🤔 JavaScriptに関する変更

Progress barの表示

ページをロードする際の読み込み時のProgress barの表示がデフォルトでONになりました。詳細は『turbolinks/turbolinks at v5.0.0』を参照ください。色を変更する場合は次のCSSを適用します。

.turbolinks-progress-bar {
height: 5px;
background-color: green;
}

非表示にしたい場合は次のCSSを適用します。

.turbolinks-progress-bar {
visibility: hidden;
}

JavaScriptで生成されるフォームへのCSRFトークンを生成

JavaScriptで生成されるフォームによるコードインジェクション攻撃に対応するためにフォーム単位でCSRFトークンを生成するようになりました。次の設定で有効になります。

config.action_controller.per_form_csrf_tokens = true

静的なファイルをRailsで返す

/public配下の静的なファイルをRailsから返す場合はconfig.public_file_server.enabled = trueを設定します。(nginx/Apacheから返却するほうが効率がよいのでfalseにすべきです)

Rails.application.configure do
# config.serve_static_files から変更
config.public_file_server.enabled = true
end

new_framework_defaults.rbについて

rails updateコマンドを実行するとconfig/initializers/new_framework_defaults.rbが生成されます。古いバージョンのRailsの挙動を保つための設定ですが、Railsの進化についていくためにも必要な設定以外はデフォルトの設定で問題なく動くようにアプリケーションの実装を修正していくとよいと思います。

🐮 補足:Forkwell JobsのRails 5へのアップデート事例

Forkwell Jobsさんのアップデート事例です。発生したエラーなどと対策が丁寧にかかれており、とてもわかり易いです。

最速で Forkwell を Rails 5 にアップグレードしてみました - Grooves開発ブログ

😎 補足:DeNAでのRails 5へのアップデート事例

DeNAのゲームプラットフォームをRuby 2.4、Rails 5にアップデートした事例です。
規模の大きなアプリケーションのアップデートの事例で、参考にするとスムーズにアップデートできそうです。

「Sakasho」のRubyを2.4に、Railsを5にアップグレードしました

🗻 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)