Rails 4系からRails 5へのアップデートに関してのTipsです。
🚌アップデートタスク
Rails 5にGemをアップデートした後にrails app:updateコマンドを実行するとconfig/environemets/やbin/配下のファイルかどが新しいバージョンのファイルを作成、既存ファイルの更新を行います。
rails app:update |
🗽Rubyの部分の変更
Active RecordはApplicationRecordを継承
Model(Active Record)はApplicationRecordを継承する形になります。
classApplicationRecord< ActiveRecord::Base |
self.abstract_class=true: 抽象クラスを表す。対応するテーブルがない場合の設定
Active JobはApplicationJobを継承
Active JobではApplicationJobを継承するように変更されました。
classApplicationJob< ActiveJob::Base |
Action MailerはApplicationMailerを継承
Action MailerはApplicationMailerを継承するようになりました。
classApplicationMailer< ActionMailer::Base |
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)で明示的にロールバックをする必要があります。
classArticle |
🐡テストに関する変更
Railsコントローラのテスト
assignsメソッド、assert_templateメソッドはGemrails-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 { |
非表示にしたい場合は次のCSSを適用します。
.turbolinks-progress-bar { |
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.configuredo |
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にアップグレードしました


