Интеграция 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
для удаления драгоценного камня, но оказалось, что некоторые зависимости остались.
Ответы
Ответ 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
.