3.7 to 4.0
This guide covers upgrading a 3.7 Spree application to Spree 4.0.
If you're on an older version than 3.7 please follow previous upgrade guides and perform those upgrades incrementally, eg.
This is the safest and recommended method.
Spree 4.0 requires Ruby 2.5.0 at least so you need to bump the ruby version in your project's
Gemfile
and .ruby-version
files.In Spree 3.6 we deprecated Paperclip support in favor of ActiveStorage. Paperclip gem itself isn't maintained anymore and it is recommended to move to ActiveStorage as it is the default Rails storage engine since Rails 5.2 release.
In Spree 4.0 we've removed Paperclip support in favor of ActiveStorage.
Please remove also any occurrences of
Rails.application.config.use_paperclip
and Configuration::Paperclip
from your codebase.OrderContents
was deprecated in Spree 3.7 and removed in 4.0. We've replaced it with service objects.You need to replace any instances of
OrderContents
usage with corresponding services in your codebase.before:
order.contents.update_cart(line_items_attributes)
after:
Spree::Cart::Update.call(order: order, params: line_items_attributes)
before:
order.contents.add(variant, quantity, shipment: shipment)
after:
Spree::Cart::AddItem.call(
order: order,
variant: variant,
quantity: quantity,
options: {
shipment: @shipment
}
)
before:
order.contents.remove(variant, quantity, shipment: shipment)
after:
Spree::Cart::RemoveItem.call(
order: order,
variant: variant,
quantity: quantity,
options: {
shipment: shipment
}
)
Similar to
OrderContents
method add_store_credit_payments
was replaced with Checkout::AddStoreCredit
service.before:
order.add_store_credit_payments
after:
Spree::Checkout::AddStoreCredit.call(order: order)
Similar to
OrderContents
method remove_store_credit_payments
was replaced with Checkout::RemeoveStoreCredit
service.before:
order.remove_store_credit_payments
after:
Spree::Checkout::RemoveStoreCredit.call(order: order)
If you're using the Address Book extension you need to remove it as this feature was merged into core Spree.
- 1.Remove this line from
Gemfile
gem 'spree_address_book', github: 'spree-contrib/spree_address_book' - 2.Remove this line from
vendor/assets/javascripts/spree/frontend/all.js
//= require spree/frontend/spree_address_book - 3.Remove this line from
vendor/assets/stylesheets/spree/frontend/all.css
//= require spree/frontend/spree_address_book
Rails 6.0 ships with a new code autoloader called Zeitwerk which has some strict rules in terms of file naming and contents. If you used
class_eval
to extend and modify Spree classes you will need to rewrite those with Module.prepend
. Eg.Old decorator syntax -
app/models/spree/order_decorator.rb
Spree::Order.class_eval do
has_many :new_custom_model
def some_method
# ...
end
end
New decorator syntax -
app/models/my_store/spree/order_decorator.rb
module MyStore
module Spree
module OrderDecorator
def self.prepended(base)
base.has_many :new_custom_model
end
def some_method
# ...
end
end
end
end
::Spree::Order.prepend(MyStore::Spree::OrderDecorator)
When migrating a class method to the new autoloader things are a little different because you will have to prepend to the Singleton class as shown in this example:
module Spree::BaseDecorator
def spree_base_scopes
# custom implementation
end
end
Spree::Base.singleton_class.send :prepend, Spree::BaseDecorator
Spree 4 uses Bootstrap 4 for both Storefront and Admin Panel. You have two options:
As we know this is a big portion of work you can still use Bootstrap 3 for your Storefront.
- 1.Copy all remaining views by running
bundle exec spree:frontend:copy_views
- 2.Add
bootstrap-sass
gem to yourGemfile
gem 'bootstrap-sass', '~> 3.4.1'
gem 'spree', '~> 4.0'
gem 'spree_auth_devise', '~> 4.0'
gem 'spree_gateway', '~> 3.6'
rails spree:install:migrations
rails spree_api:install:migrations
rails spree_auth:install:migrations
rails spree_gateway:install:migrations
rails db:migrate
Last modified 1yr ago