Msgstr "отсутствует требуемый параметр: bucket option" для Paperclip/S3

В моем приложении Rails я разрешаю пользователям загружать изображение, когда они создают "выпуск", и он должен загружаться непосредственно на S3. Я получаю следующую ошибку как в разработке, так и в производстве.

РЕДАКТИРОВАТЬ: Я должен заметить, что эта ошибка возникает при попытке загрузить с страницы редактирования выпуска в форме submit.

ArgumentError in ReleasesController#update

missing required :bucket option
Rails.root: /Users/jasondemeuse/pressed

Я делал это раньше, без проблем с использованием Carrierwave, но не могу понять, что я делаю неправильно сейчас, когда я использую Paperclip. Все исправления, которые я видел в SO и в других местах, - проблемы геройки, но у меня такая же проблема при разработке, и ни одна из исправлений не помогла.

Здесь соответствующий код ( "..." указывает не соответствующие фрагменты):

development.rb

Appname::Application.configure do

...

  config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => 'http',
    :s3_credentials => {
      :bucket => ENV['AWS_BUCKET'],
      :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
  }
end

production.rb

Appname::Application.configure do

...

  config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => 'http',
    :s3_credentials => {
      :bucket => ENV['AWS_BUCKET'],
      :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
  }
end

release.rb

class Release < ActiveRecord::Base
  attr_accessible ... :banner


  belongs_to :user


  has_attached_file :banner, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>',
    spread: '1200x200'
  }

  has_many :banners, :dependent => :destroy
  accepts_nested_attributes_for :banners, :allow_destroy => true


end

show.html.erb

<%= image_tag @release.banner.url(:medium) %>
<%= @release.banner.url %>

// Have both of these in for now to see if they work, but since the upload isn't working it giving me the missing.png

_form.html.erb

<%= f.label "Add A Banner?" %><br />
<%= f.file_field :banner %>

Конфигурация heroku (для этого есть то же самое в .bash_profile)

AWS_ACCESS_KEY_ID:            XXXXXXXXXXXXXXXX
AWS_BUCKET:                   appname
AWS_SECRET_ACCESS_KEY:        XXXXXXXXXXXXXXXXXXXXXXXXXXX

EDIT: Здесь моя соответствующая часть моего контроллера тоже

  def update
    @release = Release.find(params[:id])


    respond_to do |format|
      if @release.update_attributes(params[:release])
        format.html { redirect_to [@user,@release], notice: 'Release was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @release.errors, status: :unprocessable_entity }
      end
    end
  end

Я знаю, что это должно быть предельно просто, и я уверен, что просто забыл что-то очевидное, но я перешел это пошаговое руководство а также исправления, которые я нашел, и ничего не работает. Есть ли задача или пакет, который я забыл запустить или что-то еще?

Заранее благодарю вас!

EDIT 2: Ниже ответы помогли мне много, и переход на fog драгоценный камень фиксировал большинство вещей для меня. На всякий случай, если у других возникают такие же проблемы, у меня также возникла еще одна проблема, которая заставляла меня сбивать с толку. Если у вас проблемы с героком и Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):, убедитесь, что вы запустили heroku rake db:migrate, а затем перезапустите heroku с помощью heroku restart. Я загрузил свою схему и ошибочно предположил, что мне не нужно это делать.

Ответ SO с приведенным выше можно найти здесь.

Ответ 1

Я думаю, что, поскольку :bucket должен быть опцией, переданной в Paperclip не на S3.
Исправлена ​​конфиг

  config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => 'http',
    :bucket => ENV['AWS_BUCKET'],
    :s3_credentials => {
      :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
  }

И Документ Paperclip:: Storage:: S3, кажется, подтверждает это, даже будучи настолько плохо написанным/отформатированным.

EDIT:

В одном из моих проектов я использую Paperclip с драгоценным камнем Fog, и это хорошо работает

Paperclip::Attachment.default_options.merge!(
  :storage => :fog,
  :fog_credentials => {
    :provider => 'AWS',
    :aws_access_key_id => ENV['S3_ACCESS_KEY_ID'],
    :aws_secret_access_key => ENV['S3_SECRET_ACCESS_KEY'],
    :region => 'eu-west-1' # in case you need it
  },
  :fog_directory => ENV['S3_BUCKET'], # only one of those is needed but I don't remember which
  :bucket => ENV['S3_BUCKET']
)

Ответ 2

В моем случае это было то, что я использовал мастера (Heroku), который использует .env файл для хранения переменных окружения. Итак, когда я сделал rake db:migrate, он не смог найти ENV['AWS_ACCESS_KEY_ID']

Что я сделал для запуска миграции, я временно добавил свои учетные данные AWS directlñy в блок конфигурации Carrierwave, а затем удалил их после...

Это не постоянное решение, потому что в следующий раз, когда вы перейдете, он скажет то же самое...

Для постоянного решения см. Использование переменных среды в задаче Rake

в котором говорится: foreman run rake some_task таким образом все переменные, определенные в .env, загружаются также для задачи rake

Ответ 3

Добавьте это в свой файл application.rb внутри модуля и класса. создайте файл local_env.yml и поместите туда переменные окружения. Этот код загрузит ваши переменные среды при запуске сервера:

config.autoload_paths += %W(#{config.root}/lib)
config.before_configuration do
    env_file = File.join(Rails.root, 'config', 'local_env.yml')
    YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value
    end if File.exists?(env_file)
end