2013-07-25 25 views
11

Nella mia app Rails permetto agli utenti di caricare un'immagine quando creano un "rilascio" e devono caricare direttamente su S3. Sto ottenendo il seguente errore sia nello sviluppo che nella produzione."missing required: bucket option" per Paperclip/S3

EDIT: Si noti che questo errore si verifica quando si tenta di caricare dalla pagina di modifica del rilascio sul modulo di invio.

ArgumentError in ReleasesController#update 

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

ho fatto prima senza problemi utilizzando Carrierwave, ma non riesco a capire quello che sto facendo male, ora che sto usando Paperclip. Tutte le correzioni che ho visto su SO e altrove sono problemi di heroku, ma sto avendo lo stesso problema sullo sviluppo e nessuna delle correzioni ha aiutato.

Ecco il codice corrispondente ("..." indica non frammenti rilevanti):

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 

rilascio .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's giving me the missing.png 

_form.html.erb

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

heroku config (lo stesso in .bash_profile per lo sviluppo)

AWS_ACCESS_KEY_ID:   XXXXXXXXXXXXXXXX 
AWS_BUCKET:     appname 
AWS_SECRET_ACCESS_KEY:  XXXXXXXXXXXXXXXXXXXXXXXXXXX 

EDIT: Ecco la mia la parte rilevante del mio controller troppo

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 

So che questo dovrebbe essere estremamente semplice e sono sicuro che ho appena dimenticato una cosa ovvia, ma mi è stato andare oltre this walkthrough così come le correzioni che ho trovato e niente sembra funzionare. C'è un rake task o bundle che ho dimenticato di eseguire o qualcosa del genere?

Grazie in anticipo!

EDIT 2: Le risposte sotto di me ha aiutato molto, e il passaggio ai fog gemma maggior parte delle cose fissati per me. Nel caso in cui altri stiano avendo questi stessi problemi, ho anche avuto un altro problema che mi ha confuso. Se hai problemi con heroku e un Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):, assicurati di eseguire heroku rake db:migrate quindi riavvia heroku con heroku restart. Ho caricato il mio schema e ho assunto erroneamente che non avrei avuto bisogno di farlo.

Una risposta SO con sopra can be found here.

+0

Quale versione di graffetta stai usando? – gregates

+0

3.4.2 - Ho 'gem" paperclip "," ~> 3.0 "' nel mio Gemfile. – Jason

+0

Immagino che una cosa da provare sia eseguire 'AWS_BUCKET = appname rails server' e vedere se si ottiene ancora l'errore. – gregates

risposta

19

Penso che sia perché :bucket dovrebbe essere un'opzione passata a Paperclip non a S3.
config fisso

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'] 
    } 
    } 

E Paperclip::Storage::S3 doc sembra confermare che, pur essendo così mal scritta/formattato.

EDIT:

In uno dei miei progetti che uso Paperclip con nebbia gemma e questo funziona bene

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'] 
) 
+1

Purtroppo non ho apportato alcuna modifica, l'ho inclusa in s3_credentials secondo [heroku walkthrough per paperclip] (https://devcenter.heroku.com/articles/paperclip-s3). Ho intenzione di esaminarlo di più, forse qualcosa in quella soluzione era errata? Grazie per l'aiuto! – Jason

+0

Secondo me dovresti continuare con il readme di Paperclip non con una guida di Heroku che non sa quanti anni abbia. –

+0

È stato pubblicato/aggiornato ad aprile e scritto da un dev su Thoughtbot, ma sì, ho anche guardato il readme di Paperclip. – Jason

0

Nel mio caso era che stavo usando caposquadra (Heroku) che utilizza un . env file per memorizzare le variabili di ambiente. Così, quando ho fatto rake db:migrate che non riusciva a trovare la ENV['AWS_ACCESS_KEY_ID']

Quello che ho fatto di eseguire il mio migrazione stato ho aggiunto temporaneamente le mie credenziali AWS directlñy nel blocco config Carrierwave e poi rimossi dopo ...

Questo è non una soluzione permanente, perché la prossima volta che la migrazione si dirà la stessa cosa ...

per la soluzione definitiva vedere: Use environment variables in Rake task

che dice utilizzo: foreman run rake some_task in questo modo tutte le variabili definite in .env vengono caricati per la rake task anche

0

Aggiungi questo al file application.rb all'interno del modulo e della classe. crea un file local_env.yml e inserisci le tue variabili di ambiente. Questo codice caricherà le variabili di ambiente all'avvio del server:

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