2009-10-11 3 views
6

新しいアプリケーション私はpaperclipを使用してS3にファイルを保存します。私は既に別のアプリのためにaws-s3の宝石をインストールしました。 Paperclipはright_awsを使うべきですが、aws-s3 gemを使用しようとしているので、いくつかの問題が発生しているようです。しかし私は私のシステムからaws-s3の宝石を取り除きたいとは思わない。この紛争を解決する方法はありますか?たぶんright_awsを使用するようにクリップを強制することによって?または設定を変更しますか?Rails aws-s3 gemとright_aws gemの間のペーパークリップの競合。の解き方?

マイセットアップ

# 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' 
... 

ありがとう!

答えて

12

うわー、それは速かった。私はちょうどAWS-S3宝石を使用して問題を解決し、したがって、読むために私のenviroment.rbを変更:

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

誰かを助け希望を!

3

この問題もありました。特定の順序で宝石を指定すると、一部の人のために働くようだ:私のアプリでは私も同様right_awsを指定するプラグイン(backup_fu)を持っていた、と私も私のプラグインで行をコメントアウトしなければならなかった

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

# 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 

これが問題である理由を知っている人はいますか?

EDIT:私のアプリケーションでは、もうright_awsは一切必要ありません。そして、backup_fu gemには、まだロードされていない場合にのみrequire_lineが必要です。私はenvironment.rbに宝石を要求することによって、aws-s3宝石と衝突したことが分かりました。これで、backup_fuプラグインは必要に応じて(通常はレーキタスクとして実行している場合のみ)ロードしますが、アプリケーションの起動時にはロードされません。

3

ここでの主な問題は、aws-s3がsend_request_with_body_streamというメソッドを再定義することです。

aws-s3のバージョンには4つの引数があり、right_http_connectionには5があります。ロード順序によっては、aws-s3はそのメソッドのright_http_connectionのバージョンを再定義できます。

私はright_http_connectionをクローンし、この問題の迅速な修正を行いました。私はright_http_connectionにプルリクエストを送った。

したがって、あなたがこの問題を修正するためにあなたのバンドルで私のGitのレポを使用することができます。

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

4

少し前までAmazonが公式AWS SDK for Rubyをリリースしました。それはS3でかなりうまく動作し、ボックスからアメリカ、ヨーロッパ、日本のS3インスタンスをサポートし、よく管理されています。

私はAWS SDKで動作するように、paperclip-awsというPaperclip用のストレージモジュールを作成しました。

気軽にお使いください。私はそれが助けることを願っています。

+0

あなたのモジュールにはaws-s3の使用を試みているようなPaperclipが必要です。それをどうすれば解決できますか? – Cristian

+0

クリスチャン、とても長い間答えてくれてありがとう。 Paperclipは開発のためだけに 'aws-s3'を必要とし、実行時には必要としません。'paperclip-aws'を使うときは、ドキュメントに表示されていてバンドルされているように、あなたのGemfileにインクルードするだけです。それ以上のことは必要ありません。 –

+1

ありがとうございます。私はすでにあなたの宝石を使ってこれを解決しました:) – Cristian