- Gemをアップデート
- Railsをアップデートしずに、バージョンをあげられるgemはあらかじめアップデートしておく
- Gemfileを編集する。gemによってはRails5に対応していない場合があるので、一旦Rails以外をコメントアウト → ひとつずつコメントインしてinstallする → 最後にDiffをチェックする(downgradeしてないか) これが一番速い
vim Gemfile
→ 編集する →bundle install
→ 繰り返す
- いくつかのgemは修正版がリリースされていないのでgithubから直接DLしてる
例: gem 'sinatra', github: 'sinatra/sinatra', ref: 'a5da6fa82c...'
- Deprecatedなエラーが出るgemは直してPR送ってあげる
- この段階ではおそらく
./bin/rails console
がwarningやエラーを吐きまくるので、一つずつ直していく。
- deprecatedなオプションは削除する。
- 例(他にもdeprecated warningが出るはずなので、ひとつずつ直していく)
config.serve_static_files
→config.public_file_server.enabled
config.static_cache_control
→config.public_file_server.headers
config.middleware
に文字列は渡せなくなった
- 新しいRailsのデフォルト設定を検証する。
./bin/rails rails:update
を叩いてすべてのdefaultファイルを一旦上書きする。その後、各ファイルのDiffを見て必要な部分だけをコピーしてcommitする。rails:update
では更新されないファイルもあるので、rails new
で作成したプロジェクトを見るのも良い
- この頃には
./bin/rails c
やテストが走るようになる。テストを直していく。 - modelのテストを修正する
ActiveRecord::Type
を使っている場合はRails5の使い方に置き換えるActiveRecord::Type.lookup(:boolean).cast(value)
- ActiveRecord::BaseではなくApplicationRecordを継承する
belongs_to
はデフォルト必須項目になる(validates :..., presence: true
と同等)- さよなら
timecop
。代わりにActiveSupportのTimeHelpersを使う(travel_to
) created_at
とかの値はnsecがfloorされるようになったっぽい?
- migrationを修正する
- 過去すべての
db/migrate/*.rb
を修正する ActiveRecord::Migration
はバージョン情報も含めて継承する- 大抵は
ActiveRecord::Migration[4.1]
orActiveRecord::Migration[4.2]
?- いつRailsのバージョンを上げたのかは重要
- 修正作業の検証は、一度
db/schema.rb
を消して./bin/rake db:drop db:create db:migrate
が動くか試すと良い。(commitはしちゃだめ) - db/schema.rbの中身が変わるため、本番にあげてからdb/schema.rbを作り直す
./bin/rake db:schema:dump RAILS_ENV=staging
- ローカルに
db/schema.rb
持ってきてdb/schema.rb
を上書きする
- controllerのテストを修正する
- warning地獄
- テストでパラメーター, cookie, sessionの渡し方が変わった
get(:show, id: 1)
->get(:show, params: { id: 1 }, session: {...}
ActionController::Parameters
- Hashを継承しなくなる(
#merge!
,#symbolized_keys
が無い) permit()
されていない場合は、いろいろなところで使えなくなった。(url_for
とかActiveRecord
)- 無理に使うのではなく
permit()
してください
- 無理に使うのではなく
- Hashのメソッドを使いたければ
#to_h
を使う。 params.permit(:roles).to_h.merge('default_value' => '1')
- キーが文字列なので注意
- Hashを継承しなくなる(
- すべてのテストが通るまで頑張る...