2009-10-11 14 views
6

per una nuova app Voglio utilizzare la graffetta per archiviare i file su S3. Ho già installato la gemma aws-s3 per un'altra app. Ciò sembra causare alcuni problemi, perché Paperclip dovrebbe usare right_aws ma sta cercando di usare la gemma aws-s3. Ma non voglio rimuovere la gemma aws-s3 dal mio sistema. C'è un modo per risolvere questo conflitto? Forse forzando la paperclip a usare right_aws? O modificando la configurazione?Rails Conflitto di graffette tra gemma aws-s3 e gemma right_aws. Come risolvere?

La mia configurazione

# enviroment.rb 
config.gem 'right_aws' 

# my model with the attachment 
has_attached_file :thumbnail, 
    :styles => { :thumb => "160x120>" }, 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/amazons3.yml", 
    :path => ":provider/:attachment/:id_:style.:extension" 

# config/amazons3.yml 
development: 
    bucket: bucketname 
    access_key_id: secret 
    secret_access_key: secret 

test: 
    bucket: bucketname 
    access_key_id: secret 
    secret_access_key: secret 

production: 
    bucket: bucketname 
    access_key_id: secret 
    secret_access_key: secret 

# The Error in the console 
ArgumentError: wrong number of arguments (5 for 4) 
    from /Library/Ruby/Gems/1.8/gems/right_http_connection-1.2.4/lib/net_fix.rb:85:in `send_request_with_body_stream' 
    from /Library/Ruby/Gems/1.8/gems/right_http_connection-1.2.4/lib/net_fix.rb:85:in `exec' 
    from /Library/Ruby/Gems/1.8/gems/right_http_connection-1.2.4/lib/net_fix.rb:144:in `request' 
    from /Library/Ruby/Gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/connection.rb:45:in `request' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:543:in `start' 
    from /Library/Ruby/Gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/connection.rb:52:in `request' 
    from /Library/Ruby/Gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/base.rb:69:in `request' 
    from /Library/Ruby/Gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/base.rb:88:in `put' 
    from /Library/Ruby/Gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/object.rb:241:in `store' 
... 

Grazie!

risposta

12

Wow, è stato veloce. Ho risolto il problema da solo utilizzando la gemma AWS-s3 e quindi cambiare il mio enviroment.rb a leggere:

#config.gem 'right_aws' 
config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3" 

Speranza che aiuta qualcuno!

3

Ho avuto anche questo problema. Specifica delle gemme in un certo ordine sembra funzionare per alcune persone:

config.gem "aws-s3", :lib => "aws/s3", :version => '>= 0.6.2' 
config.gem "paperclip", :version => '>= 2.3.1.1' 
# config.gem "right_aws" 

Nella mia app ho avuto anche un plugin (backup_fu) specificando right_aws così, e ho dovuto commentare la riga nel mio plug-in, come pure :

# backup_fu.rb 
require 'yaml' 
require 'active_support' 
require 'mime/types' 
require 'right_aws' unless defined?(RightAws) 
require 'erb' 

class BackupFuConfigError < StandardError; end 
class S3ConnectError < StandardError; end 

class BackupFu 
    # etc... 
end 

Qualcuno sa perché questo è un problema?

MODIFICA: Nella mia app non ho più bisogno di right_aws e poi nel backup_fu gem ho cambiato la riga require per richiedere solo right_aws se non è già caricato. Ho scoperto che richiedendo la gem in environment.rb, ha causato un conflitto con la gemma aws-s3. Così ora il plugin backup_fu lo caricherà se necessario (di solito solo quando è in esecuzione come attività di rake), ma non quando l'app viene avviata.

3

Il problema principale qui è che aws-s3 ridefinisce un metodo chiamato send_request_with_body_stream.

La versione di aws-s3 ha 4 argomenti e right_http_connection ha 5. A seconda dell'ordine di caricamento, aws-s3 può ridefinire la versione di right_http_connection di quel metodo.

Ho clonato right_http_connection e ho risolto una soluzione rapida per questo problema. Ho inviato una richiesta di pull a right_http_connection.

pertanto è possibile utilizzare il mio git repo nel vostro pacchetto per risolvere questo problema:

gem 'right_http_connection', :git => "git://github.com/gammons/right_http_connection"

4

Non molto tempo fa, Amazon ha rilasciato ufficiale AWS SDK for Ruby. Funziona piuttosto bene con S3, supporta istanze S3 americane, europee e giapponesi dalla scatola e ben mantenuto.

Ho creato un modulo di archiviazione per Paperclip chiamato paperclip-aws per funzionare con AWS SDK.

Sentitevi liberi di usarlo. Spero che possa essere d'aiuto.

+0

Il modulo richiede Paperclip, che sembra provare a utilizzare aws-s3. Come posso risolverlo? – Cristian

+0

Cristian, mi scusi per la risposta così lunga. Paperclip richiede 'aws-s3' solo per lo sviluppo, non per il runtime.Quando usi 'paperclip-aws ', dovresti includere nel tuo Gemfile, come mostrato nella documentazione e poi in bundle. Niente di più è necessario. –

+1

Grazie. Ho già risolto questo usando il tuo gioiello :) – Cristian

Problemi correlati