OmbuLabs Blog

The Lean Software Boutique

Upgrade Rails from 4.2 to 5.0

This article is part of our Upgrade Rails series. To see more of them, click here.

This article will cover the most important aspects that you need to know to get your Ruby on Rails application from version 4.2 to 5.0.

  1. Ruby version
  2. Gems
  3. Config files (config/)
  4. Application code
    1. ActiveRecord
    2. Controllers
  5. Testing
  6. Next steps

1. Ruby version

Rails 5.0 requires Ruby 2.2.2 or later.

This Ruby upgrade shouldn't generate any problems. However, if you run into this exception in your test suite:

cannot load such file -- test/unit/assertions (Load Error)

then you'll need to add:

gem 'test-unit'

to your Gemfile.

2. Gems

  • It's recommended that you check your Gemfile against Ready4Rails to ensure all your gems are compatible with Rails 5. As of the release of this blog post, there are only a few gems which don't support Rails 5 yet. This is more of a problem when you're upgrading early on.

If any of the gems are missing on Ready4Rails, you'll need to manually check the Github page for the project to find out its status. In case you own the gem, you'll need to make sure it works on Rails 5 or update it.

3. Config files

Rails includes the rails app:update task. You can use this task as a guideline as explained thoroughly in this post.

As an alternative, check out RailsDiff, which provides an overview of the changes in a basic Rails app between 4.2.x and 5.0.x (or any other source/target versions).

4. Application code

a. ActiveRecord

  • ActiveRecord models will now inherit from ApplicationRecord by default instead of ActiveRecord::Base. You should create an application_record.rb file under app/models with:
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

And then update all of your models to inherit from ApplicationRecord instead of ActiveRecord::Base. The only class that inherits from ActiveRecord::Base will be ApplicationRecord.

  • belongs_to associations are now required by default. This means that if the association doesn't exist for a model when saving it, an error will be triggered. You can turn this feature off for an association by using optional: true:
belongs_to :user, optional: true

b. Controllers

  • If you're not already using strong parameters, and still rely on protected_attributes, you should migrate your application to strong parameters before attempting to upgrade to Rails 5.0. protected_attributes is no longer supported on Rails 5.0.

A few months ago we worked on a project to attempt to automate the strong parameters migration process, and this resulted in the gem RailsUpgrader. It's in a beta state, but you can try using it if you have too many models, or at least as a guide for a WIP branch.

There are still efforts being made to keep protected_attributes alive though, like the protected_attributes_continued gem. I would strongly recommend against using it since its support is limited, and it won't work in future Rails versions.

  • Parameters now behave differently, they no longer inherit from HashWithIndifferentAccess. Some methods (e.g.: fetch, slice, except) you may be now calling on params will no longer work. You will need to permit the parameters, call to_h, and only then you'll be able to run the Hash methods you need on them.

For more information:

5. Testing

  • One of the most common methods in controller tests, assigns, has been extracted from Rails and moved to the rails-controller-testing gem. If you wish to continue using it (and assert_template), you'll need to add it to your Gemfile:
gem 'rails-controller-testing'
  • Instead of using ActionDispatch::Http::UploadedFile to test uploads, you'll need to update those tests to use Rack::Test::UploadedFile.

6. Next steps

If you successfully followed all of these steps, you should now be running Rails 5.0! Do you have any other useful tips or recommendations? Share them with us in the comments section.

If you don't have the time to upgrade your Rails app, check out our Ruby on Rails upgrade service: