2012-02-20 3 views
5

У меня есть ведро S3 для производства и разработки. Я провел свое исследование и came across this post, но моя текущая конфигурация не работает должным образом. Я получаю следующее исключение (ниже) локально, и я не получаю загрузку файлов в моем S3 ведро из моего Heroku приложения:howto: Базовая установка несущей волны [Heroku и S3]

is not a recognized storage provider 
Extracted source (around line #3): 

1: 
2: <p><%= user.name %></p> 
3: <%= image_tag user.avatar.url %> 
4: <%= link_to 'Show', user %> 
5: <%= link_to 'Edit', edit_user_path(user) %> 
6: <%= link_to 'Destroy', user, confirm: 'Are you sure?', method: :delete %> 

Однако Когда я установил storage :file внутри файла *_uploader.rb все работает, как ожидалось на местном уровне. Но все равно замечание когда-либо отправляется на мой ведро S3.

Вот мой набор вверх:

user.rb

class User < ActiveRecord::Base 
attr_accessible :name, :avatar, :avatar_cache, :remote_avatar_url, :remove_avatar 
mount_uploader :avatar, AvatarUploader 
end 

fog.rb

CarrierWave.configure do |config| 
    if Rails.env.production? 
    config.storage = :fog 
    config.fog_credentials = { 
    :provider    => 'AWS', 
    :aws_access_key_id  => ENV['S3_K'], 
    :aws_secret_access_key => ENV['S3_SCRT'], 
    :region    => ENV['S3_RG'] 
    } 
    config.fog_directory = ENV['S3_BUCKET'] 
    config.fog_host  = 'http://www.example.com' 
    config.fog_public  = true         # optional, defaults to true 
    config.fog_attributes = {'Cache-Control' => 'max-age=315576000'} # optional, defaults to {} 

else 
#for development and testing locally 
    config.storage = :file 
    config.enable_processing = false 
end 
end 

* _uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base 

storage :fog 

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

def extension_white_list 
    %w(jpg jpeg gif png) 
end 

end 

users_controller.rb

def new 
@user = User.new 
@user.avatar = params[:file] 
    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @user } 
    end 
end 

def create 
@user = User.new(params[:user]) 
@user.avatar = params[:file] 
    respond_to do |format| 
    if @user.save 
    format.html { redirect_to @user, notice: 'User was successfully created.' } 
    format.json { render json: @user, status: :created, location: @user } 
    else 
    format.html { render action: "new" } 
    format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
end 

конец

UPDATE Благодаря @ CanBerkGüder я могу подтвердить, что я в состоянии сохранить запись, но не файл изображения. В любое время, когда я пытаюсь создать объект пользователя, мой журнал heroku выплевывает:

2012-02-20T23:19:45+00:00 app[web.1]: app/controllers/users_controller.rb:46:in `block in create' 
2012-02-20T23:19:45+00:00 app[web.1]: app/controllers/users_controller.rb:45:in `create' 
2012-02-20T23:19:45+00:00 app[web.1]: 
2012-02-20T23:19:45+00:00 app[web.1]: cache: [POST /users] invalidate, pass 
+1

Две вещи, которые нужно проверить: 1. это драгоценный камень «тумана», указанный в вашем Gemfile? 2. если это так, попробуйте указать config.storage =: fog в инициализаторе. –

+0

@ CanBerkGüder Я обновил свой инициализатор и до сих пор не повезло, просмотрите раздел UPDATE для того, что произошло после обновления. – rhodee

+0

Структура каталогов не важна, как говорят документы, просто потому, что на S3 нет каталогов (это просто файл с именем uploads/user/avatar/1/2_48x48.png). К сожалению, я не могу думать о третьей причине, которая может вызвать ошибку, которую вы видите. –

ответ

1

ОК, вот идея. CarrierWave по-прежнему включает адаптер S3 для обратной совместимости, который использует туман под ним, который я лично использую вместо :fog. Теоретически, между ними не должно быть разницы, но я думаю, что это стоит того. Вот мой CarrierWave инициализатор от живого приложения, работающие на Heroku:

CarrierWave.configure do |config| 
    if Rails.env.production? 
    config.root = Rails.root.join('tmp') 
    config.cache_dir = 'carrierwave' 

    config.storage = :s3 
    config.s3_access_key_id = ENV['S3_KEY'] 
    config.s3_secret_access_key = ENV['S3_SECRET'] 
    config.s3_bucket = ENV['S3_BUCKET'] 
    else 
    config.storage = :file 
    end 
end 

Первые две строки (config.root и config.cache_dir) будут там работать вокруг только для чтения файловой системы Heroku, которая должна иметь ничего сделайте с вашей проблемой.

+0

Я столкнулся с обновлением двух строк в документах, спасибо, что напомнил мне. Как должен выглядеть мой контроллер? Нужно ли добавлять строки, такие как '@user.avatar = params [: file] ', в мои' новые' и 'create' действия? – rhodee

+0

Ваш ответ не работал в моей настройке, но он определенно вдохновил некоторые исследования с моей стороны! Спасибо. – rhodee

+0

@rhodee жаль слышать, что он не работает. пожалуйста. –

0

Один вопрос может быть

config.fog_host  = 'http://www.example.com' 

Если вы используете этот параметр, вы, вероятно, нужен настоящий хозяин там. Предположительно, вы можете прокомментировать эту строку, хотя я ее очень рекомендовал.

И я полагаю, вы установили переменные ENV на Heroku?

heroku config:add S3_K=[my_s3_key] S3_SCRT=[my_s3_secret] S3_RG=[us-east-1]S3_BUCKET=[my_bucket_name] 

Я использовал почти такую ​​же установку. Шахта не сработала, но я думаю, что я сделал еще один шаг:

Missing required arguments: aws_access_key_id, aws_secret_access_key 
Смежные вопросы