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
を継承する形になります。
class ApplicationRecord < ActiveRecord::Base |
self.abstract_class=true
: 抽象クラスを表す。対応するテーブルがない場合の設定
Active JobはApplicationJobを継承
Active JobではApplicationJob
を継承するように変更されました。
class ApplicationJob < ActiveJob::Base |
Action MailerはApplicationMailerを継承
Action MailerはApplicationMailerを継承するようになりました。
class ApplicationMailer < 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)
で明示的にロールバックをする必要があります。
class Article |
🐡 テストに関する変更
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 { |
非表示にしたい場合は次の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.configure do |
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にアップグレードしました
🗻 参考リンク
- self.abstract_class = true の意味と挙動 « Codaholic
- Rails 5 does not halt callback chain when false is returned
- Rails 5の新フレームワークデフォルト設定ファイルでアップグレード作業を軽減する
- Rails 5
serve_static_assets
deprecation warning