Pull to refresh

Spree 3 и Google Cloud Storage

Google Cloud Platform *Ruby on Rails *Development for e-commerce *
Awaiting invitation
Привет, Хабр!

(актуально для версии до 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.: Это мой первый гайд, не бейте сильно тапками. Надеюсь, что кому-нибудь это было полезным :)
Tags:
Hubs:
You can’t comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.