2

Я пытаюсь загрузить и отобразить изображения из ведра S3 в мое приложение 4 рельсов на герою. Я хочу добавить изображение при создании объекта «Дизайнер»правильный способ настройки опции buck paperclip для S3

Я использую paperclip. В config/environments/production.rb:

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

Я установил конфигурационные переменные

$ heroku config 
AWS_ACCESS_KEY_ID:   AKIAI...HVWD2YQ 
AWS_BUCKET:     myafricastyle 
AWS_SECRET_ACCESS_KEY:  VFgFVF4.....gKnT5AMFtP4 

Это модель, которую я хочу добавить изображения:

class Designer < ActiveRecord::Base 
    has_many :items, dependent: :destroy 

    has_attached_file :avatar, styles: { 
     thumb: '100x100>', 
     square: '200x200#', 
     medium: '300x300>' 
    }      
end 

У меня есть миграции, чтобы добавить изображения к Таблица конструкторов ..

class AddAttachmentAvatarToDesigners < ActiveRecord::Migration 
    def self.up 
    change_table :designers do |t| 
     t.attachment :avatar 
    end 
    end 

    def self.down 
    drop_attached_file :designers, :avatar 
    end 
end 

Когда я пытаюсь добавить конструктор с загруженной фотографией я получаю:

$ heroku logs 

[paperclip] saving /designers/avatars/000/000/016/original/moto_ninjas87.jpg 
[paperclip] saving /designers/avatars/000/000/016/original/moto_ninjas87.jpg 
Completed 500 Internal Server Error in 2622ms 
Completed 500 Internal Server Error in 2622ms 
app/controllers/designers_controller.rb:33:in `block in create' 
app/controllers/designers_controller.rb:33:in `block in create' 
app/controllers/designers_controller.rb:32:in `create' 

ArgumentError (missing required :bucket option): 
ArgumentError (missing required :bucket option): 
app/controllers/designers_controller.rb:32:in `create' 

Что случилось с моей конфигурацией опции ведра?

аддитивные: мои controllers/designers_controller.rb показывает:

def create 
    @designer = Designer.new(designer_params) 

    respond_to do |format| 
     if @designer.save 
     format.html { redirect_to @designer, notice: 'Designer was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @designer } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @designer.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_designer 
     @designer = Designer.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def designer_params 
     params.require(:designer).permit(:name, :country, :about, :avatar) 
    end 

Я оба aws-sdk и paperclip камни установлены

+1

Что в вашем 'DesignersController # метод create', линия 32-33? Вы добавили жемчужину 'aws-sdk'? – marzapower

ответ

0

Следующая происходит потому, что вы звоните @ designer.save в методе создания и paperclip добавляет post-create hook к вашему классу дизайнеров.

ArgumentError (missing required :bucket option): 
app/controllers/designers_controller.rb:32:in `create' 

Чтобы исправить это, я думаю, что

:bucket => ENV['AWS_BUCKET'] 

принадлежит один уровень вверх в хэш. Итак:

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

Для получения дополнительной информации см: http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3

1

Вы пропускаете ведро в хэш, который передается s3_credentials. Также вы должны рассмотреть возможность переноса config в файл yml и загрузить его оттуда.

:storage => :s3, 
:path => "/archive/:style/:id/:filename", 
:s3_credentials => File.join(Rails.root, 'config', 's3.yml') 

s3.yml файл

production: 
    bucket: <%= ENV['S3_BUCKET'] %> 
    access_key_id: <%= ENV['S3_ACCESS_KEY_ID'] %> 
    secret_access_key: <%= ENV['S3_SECRET_ACCESS_KEY'] %> 
Смежные вопросы