2012-02-20 18 views
5

Ho un secchio S3 per la produzione e lo sviluppo. Ho effettuato la mia ricerca e came across this post ma la mia configurazione attuale non funziona come previsto. Ottengo la seguente eccezione (sotto) a livello locale e ottengo alcun file arrivi al mio secchio S3 dal mio Heroku app:howto: Impostazione di base di carrierwave [Heroku e 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 %> 

Tuttavia quando ho impostato storage :file all'interno del file *_uploader.rb tutto funziona come previsto a livello locale. Ma notiamo sempre che viene inviato al mio secchio S3.

Qui è la mia messa a punto:

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 

fine

UPDATE Grazie a @ CanBerkGüder Posso confermare che sono in grado di salvare il record, ma non il file di immagine. Ogni volta che tento di creare un oggetto utente, il mio registro Heroku sputa fuori:

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

Due cose da verificare: 1. è la gemma 'nebbia' elencata nel tuo Gemfile? 2. se lo è, prova a specificare config.storage =: fog nell'inizializzatore. –

+0

@ CanBerkGüder Ho aggiornato il mio inizializzatore e ancora senza fortuna, per favore vedi la sezione AGGIORNAMENTO per quello che è successo dopo che ho aggiornato. – rhodee

+0

La struttura della directory non è importante, come dicono i documenti, semplicemente perché non ci sono directory su S3 (è solo un file chiamato uploads/user/avatar/1/2_48x48.png). Purtroppo, non riesco a pensare a una terza ragione che potrebbe causare l'errore che stai vedendo. –

risposta

1

OK, ecco un'idea. CarrierWave include ancora un adattatore S3 per compatibilità con le versioni precedenti che utilizza la nebbia al di sotto, che io personalmente uso invece di :fog. In teoria, non ci dovrebbero essere differenze tra i due, ma penso che valga la pena sparare. ci

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 

Le prime due righe (config.root e config.cache_dir) sono per aggirare filesystem di sola lettura di Heroku, che dovrebbe hanno nulla a che: Ecco il mio CarrierWave initializer da un'applicazione diretta in esecuzione su Heroku fare con il tuo problema.

+0

Ho trovato l'aggiornamento di due righe nei documenti, grazie per avermelo ricordato. Come dovrebbe essere il mio controller? Devo aggiungere una riga come '@user.avatar = params [: file] 'alle azioni' new' e 'create'? – rhodee

+0

La risposta non ha funzionato nel mio setup, ma ha sicuramente ispirato alcune ricerche da parte mia! Grazie. – rhodee

+0

@rhodee mi spiace di sentire che non ha funzionato. prego. –

0

Un problema potrebbe essere

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

Se si utilizza questa impostazione, probabilmente avete bisogno di un vero e proprio ospite lì. Presumibilmente puoi commentare quella frase, anche se l'ho vista altamente raccomandata.

E presumo che tu abbia impostato le tue variabili ENV su Heroku?

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

Ho usato praticamente la stessa configurazione. Il mio non ha funzionato, ma penso di aver fatto un passo o due ulteriori:

Missing required arguments: aws_access_key_id, aws_secret_access_key 
Problemi correlati