Suggested Workflow
Set the ruby version in .ruby-version to 2.3.5, then perform these steps one by one, fixing errors as they occur:
- Update gems as listed below, and bundle
- Boot a Rails console - see below for a list of changes you will probably need
- Run Specs with --backtraceoption
- Run Cucumber features (with Geordi's --debugoption)
- When all tests are green, look through your Gemfile and remove as many version constraints as possible.
- Boot the application in different environements to spot further issues, e.g. rails console staging
Gem updates
- 
Replace ruby-debugwithbyebugorpry
- 
Replace mysqlwithmysql2, '< 0.3'
- 
Remove oniguruma
- 
Remove net-sshandnet-scp
- 
Remove fastercsv
- 
Remove cucumber_spinner
- 
Remove rspec_spinner
- 
Update rspecto'< 2'
- 
Lock hamlto'= 3.1.7'
- 
Unlock andand
- 
Unlock rake
- 
Lock test-unitto'= 1.2.3'
- 
Lock database_cleanerto'< 1.3'
- 
Lock cucumberto'< 2'
- 
Lock launchyto'~> 2.1 '
- 
Lock paperclipto'< 2.8'
- 
Add capybara-screenshotand require it in Cucumber features. It will simplify debugging failing features.require 'capybara-screenshot/cucumber' Capybara::Screenshot.prune_strategy = { keep: 12 } # parallel_tests
- 
TODO: Add rspec-patchesgem from PH
Code changes
- Remove UTF8 hints at the top of files
- Pay tight attention to method privacy. Ruby 2.3 is more whiny about misusage, especially for Methods defined with define_method.
- Use the spec_label implementation that works in Ruby 2
- Update requirestatements in features/support/env.rb. Use morerequire_relativeorrequire Rails.root.join('...')
- Fix Float rounding issues with BigDecimal('12.3')
- Use ' 'fornbsphelper instead of0xC2.chr + 0xA0.chr
- Remove /sregex modifier (your files are UTF8 anyway
- Remove rcov
- In Rakefile, replace require 'rake/rdoctask'withrequire 'rdoc/task'
- Error: wrong number of arguments (given 1, expected 0)
- 
Use procs instead oflambdas where they are called with variable arguments. Look fornamed_scopes.
- Error: Attempt to call private method, NoMethodError
- 
Fix tests by replacing thing.private_methodwiththing.send :private_method
- will_paginate errors
- 
If you get pagination errors, make sure a collection isn't silently replaced after pagination: # does not work @contracts = @contracts.reject {...} # works @contracts.reject! {...}
YAML fixes
- 
Change # old date: order: [ :day, :month, :year ] # new date: order: - :year - :month - :day
Also see Upgrade from Ruby 1.8.7 to 2.1.5 – an incomplete guide.