Spree 3 и Google Cloud Storage

Привет, Хабр!

(актуально для версии до Spree 3.4 включительно, начиная с версии 3.5 работать не будет)

Столкнувшись с проблемой, готового решения найдено не было, в следствии чего приобрел опыт коим есть желание поделится.

Дело в том что, разработчики о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.: Это мой первый гайд, не бейте сильно тапками. Надеюсь, что кому-нибудь это было полезным :)
Теги:
spree, google cloud storage, ruby on rails

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.