Spree 3 и Google Cloud Storage

в 15:47, , рубрики: Google Cloud Platform, ruby on rails, Разработка под e-commerce, метки: , ,

Привет!

Столкнувшись с проблемой, и не найдя готового решения, я решил поделится небольшим своим опытом.
Дело в том что, разработчики о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.:
Это мой первый гайд, не бейте сильно тапками.
Надеюсь что кому-нибудь это было полезным :)

Автор: рекрут

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js