From 4.2 to 5.0 Rails migration [Part 1]

A 2 minute read, Posted by Thomas Brennetot on Thu, Feb 25, 2016
In
Tags rails, 4.2, 5.0, migration

The post will cover my experience. So, my experience, my project, my migration. It won’t be the same for you.

Rails 5 still in beta 1 when I made the migration.

As addationnal gems to Rails, the project have:

  • cancancan
  • devise
  • devise-i18n
  • puma
  • rolify
  • autoprefixer-rails
  • simple_form
  • slim-rails

At that point tests doesn’t even run.

By the way, I have 78 tests.


Devise

  devise-3.5.3/lib/devise/failure_app.rb:9:in `<class:FailureApp>': uninitialized constant ActionController::RackDelegation (NameError)

It’s due to the removal of RackDelegation. It seems it was used for request and response object. It exists now in all controllers. The PR that remove it. The ticket issue in the tracker.

The solution is to use the master branch on Github.

  gem 'devise', github: 'plataformatec/devise', branch: 'master'

At that point, the test can run … with a errors but run.

=> 78 examples, 23 failures


  Failure/Error: expect(assigns(:organisations)).to eq(organisations)
     NoMethodError:
       assigns has been extracted to a gem. To continue using it,
               add `gem 'rails-controller-testing'` to your Gemfile.

Self explained. Added that gem.

=> 78 examples, 23 failures

That’s strange. It doesn’t solve the problem. The issue seems to come from RSpec.


Let’s update RSpec to the master branch (the latest doesn’t support Rails 5 yet).

    %w[rspec-core rspec-expectations rspec-mocks rspec-rails rspec-support].each do |lib|
      gem lib, github: "rspec/#{lib}", branch: 'master'
    end

It’s installing a very old version (1.x instead of 4.x) of guard-rspec. No new version yet, let’s remove it for now.

=> 78 examples, 8 failures


You’ll need to update web-console to version 3

=> 78 examples, 6 failures


Error from routes helper “*_path”

  ActionView::Template::Error:
       undefined local variable or method `organisations_path' for #<#<Class:0x007ff526bd7248>:0x007ff52abae2e0>

In the console, it exists:

  [4] pry(main)> app.organisations_path
  => "/organisations"

Still have the error, let’s keep it for now.

Remark: even with this error the application seems to work correctly.

Let’s remove the deprecating warnings noises.

Deprecations fixes

ActionController::TestCase HTTP request

The message:

  DEPRECATION WARNING: ActionController::TestCase HTTP request methods will accept only
  keyword arguments in future Rails versions.

  Examples:

  get :show, params: { id: 1 }, session: { user_id: 1 }
  process :update, method: :post, params: { id: 1 }

For me, it was mostly changing from:

  get :homepage, {}

to:

  get :homepage, params: {}

[EDIT July 2019] Migrated from CoderWall. No part 2.