Images
Overview
This guide explains how to change Product Images dimensions and different storage options for ActiveStorage which is the default attachment storage system in Spree.
Dimensions
To change the default image dimensions or add new ones you need to create a decorator file:
mkdir -p app/models/spree && touch app/models/spree/image_decorator.rb
with the following content:
module Spree
module ImageDecorator
module ClassMethods
def styles
{
# change existing default sizes used in Admin Panel and API
mini: '48x48>',
small: '100x100>',
product: '240x240>',
large: '600x600>',
# add your new size here, which will be automatically available in the API
my_custom_size: '1000x1000>'
}
end
end
def self.prepended(base)
base.inheritance_column = nil
base.singleton_class.prepend ClassMethods
end
end
Image.prepend(ImageDecorator)
end
Using image variations in templates
You can also create image variations on the fly in your templates, eg.
<%= image_tag(main_app.url_for(@product.images.first.attachment.variant(resize: '150x150'))) %>
Storage service
By default Spree will use the storage service you have set in your environment file eg. config/environments/development.rb
:
config.active_storage.service = :amazon
If you have multiple storage services you can customize which storage service to use for images. This is done in the config/initializers/spree.rb
:
Spree.public_storage_service_name = :amazon
The storage name needs to match the name you configured in config/storage.yml
.
Using CDNs
To use a CDN service such as AWS Cloudfront or Cloudflare, you need to set Spree.cdn_host
to the hostname of your CDN service. This is done in the config/initializers/spree.rb
:
Spree.cdn_host = 'https://mycloudfrontserviceid.cloudfront.net'
Spree will handle the rest as we have a built-in reverse proxy for ActiveStorage.
To use CDN in your templates please use cdn_image_url
helper:
<%= main_app.cdn_image_url(@product.images.first.attachment.variant(resize: '150x150')) %>
Was this page helpful?