Привет!
Столкнувшись с проблемой, и не найдя готового решения, я решил поделится небольшим своим опытом.
Дело в том что, разработчики оpen-source движока для интернет магазина (Spree), подружили только с S3 (Amazon Cloud Storage).
Но вы можете это исправить, для этого вам потребуется гем
gem 'paperclip-gcs'
Предположим что у вас есть уже «Сегмент» (объект хранилища google), и что бы paperclip начал с ним работать, необходимо добавить следующий код в /config/initializers/spree.rb
Spree.config do |config|
module Paperclip
module Interpolations
def rails_root attachment, style_name
Pathname.new()
end
# def rails_root attachment, style_name
# Pathname.new(ENV['UPLOADER_UUID'].to_s)
# end
end
end
Paperclip.interpolates(:gcs_path_url) do |attachment, style|
"#{attachment.gcs_protocol}//#{attachment.gcs_host_name}/#{attachment.gcs_bucket_name}/#{attachment.path(style)}"
end unless Paperclip::Interpolations.respond_to?(:gcs_path_url)
Paperclip::Attachment.default_options[:storage] = :gcs
Paperclip::Attachment.default_options[:gcs_bucket] = "xxxxxxxxxxxx"
Paperclip::Attachment.default_options[:url] = ":gcs_path_url"
Paperclip::Attachment.default_options[:path] = ":model/:id/:style/:name.:extension"
Paperclip::Attachment.default_options[:gcs_credentials] = {
project: 'xxxxxxxxxx',
google_storage_secret_access_key: 'XXXXXXXXXXXXXXX',
google_storage_secret_access_key: 'XXXXXXXXXXXXXXX'
}
Paperclip::Attachment.default_options[:gcs_permissions] = :public_read
attachment_config = {
styles: {
mini: "48x48>",
small: "100x100>",
product: "240x240>",
large: "600x600>"
},
default_style: "product"
}
attachment_config.each do |key, value|
Spree::Image.attachment_definitions[:attachment][key.to_sym] = value
end
end
И все, теперь все картинки к вашим товарам и всему остальному аккуратно будут хранится в хранилище гугл.
Закомментированный метод rails_root я переписал для того, что бы в одном «Сегменте» было удобно хостить несколько приложений, т.к. приложения имеют собственный идентификатор, который выступает как имя папки, куда загружаются все файлы из приложения.
Что-бы добавить такой функционал создать модель
rails g model Uuid uuid:string
затем добавить в /config/environments/development.rb и /config/environments/production.rb генерацию UUID, желательно в конец файла
...
config.after_initialize do
if ActiveRecord::Base.connection.data_source_exists? 'uuids'
Uuid.create(uuid: SecureRandom.uuid) unless Uuid.first.present?
ENV["UPLOADER_UUID"] = Uuid.first.uuid.to_s
end
...
При первом запуске приложения создается идентификатор, который сохраняется в базе, и используется в качестве названия для папки в облачном хранилище.
P.S.:
Если вы удалите метод rails_root из spree.rb тогда в хранилище будет продублирован абсолютный путь к файлам как на вашей локальной машине.
P.P.S.:
Это мой первый гайд, не бейте сильно тапками.
Надеюсь что кому-нибудь это было полезным :)
Автор: рекрут