Подтвердить что ты не робот

Интеграция AWS S3 дает метод undefined `match '

Я работаю над простым проектом, используя Paperclip для загрузки изображений. Все работает отлично, пока я не попытался интегрировать S3 с Paperclip. При загрузке изображения пользователя я получаю ошибку NoMethodError (undefined method 'match' for nil:NilClass):. Это происходит только тогда, когда у меня запущена моя конфигурация S3 - если я прокомментирую ее загрузку файла отлично.

Моя конфигурация:

development.rb:
....
....
  config.paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => ENV['AWS_BUCKET_ID'],
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
  }
}

Моя модель:

 class User < ActiveRecord::Base
        has_attached_file :image_file, default_url: "/myapp/images/:style/missing.png"
        validates_attachment_file_name :image_file, matches: [/png\Z/, /jpeg\Z/, /tiff\Z/, /bmp\Z/, /jpg\Z/]

вывод всей ошибки с консоли:

NoMethodError (undefined method `match' for nil:NilClass):
  app/controllers/images_controller.rb:33:in `block in create'
  app/controllers/images_controller.rb:32:in `create'

Вещи, которые я пробовал:

  • Я добавил ключи AWS и имя ковша непосредственно в код вместо как переменной среды.

  • Как уже упоминалось выше, я прокомментировал конфигурацию AWS в файле окружения и, казалось, работал отлично.

Возможно, стоит упомянуть, что раньше я установил камень fog, чтобы начать настройку для Google Cloud Storage, но решил использовать S3 вместо этого. Я использовал gem uninstall fog для удаления драгоценного камня, но оказалось, что некоторые зависимости остались.

4b9b3361

Ответ 1

Добавьте :s3_region в свою конфигурационную карту:

например.

config.paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => ENV['AWS_BUCKET_ID'],
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
  },
  :s3_region => ENV['AWS_REGION']
}

К сожалению, это функция v5.0.0 (в бета-версии). И поэтому в документах ничего нет. Однако есть комментарий об этом в фактическом коде 5.0.

Также хорошо заметить, что клавиша s3_permissions в papertrail ожидает теперь строковое значение (оно используется для принятия символов).

:s3_permissions => 'public-read'

Ответ 2

Вам нужно указать область в s3_credentials, таким образом, как region: ENV["AWS_REGION"]. Что касается очистки неиспользуемых камней, вы можете запустить bundle clean.