6

新しいアプリの場合、ペーパークリップを使用してファイルを S3 に保存したいと考えています。別のアプリ用に aws-s3 gem を既にインストールしています。Paperclip は right_aws を使用する必要がありますが、aws-s3 gem を使用しようとしているため、問題が発生しているようです。しかし、システムから aws-s3 gem を削除したくありません。この競合を解決する方法はありますか? ペーパークリップに right_aws の使用を強制することでしょうか? それとも設定変更で?

私のセットアップ

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

ありがとう!

4

4 に答える 4

12

うわー、それは速かった。aws-s3 gemを使用するだけで問題を解決したため、enviroment.rbを次のように変更しました。

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

それが誰かを助けることを願っています!

于 2009-10-11T13:42:44.980 に答える
4

少し前に、Amazon は公式の AWS SDK for Ruby をリリースしました。S3 とうまく連携し、アメリカ、ヨーロッパ、日本の S3 インスタンスを最初からサポートし、メンテナンスも行き届いています。

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

お気軽にご利用ください。それが役立つことを願っています。

于 2011-08-12T12:12:45.220 に答える
3

私もこの問題を抱えていました。特定の順序で宝石を指定すると、一部の人にとってはうまくいくようです。

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) も指定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

なぜこれが問題なのか誰か知っていますか?

編集: 私のアプリでは、right_aws をまったく必要としなくなりました。次に、backup_fu gem で、require 行を変更して、まだロードされていない場合にのみ right_aws を要求するようにしました。environment.rb で gem を要求すると、aws-s3 gem と競合することがわかりました。そのため、backup_fu プラグインは必要に応じて (通常は rake タスクとして実行している場合にのみ) ロードしますが、アプリの起動時にはロードしません。

于 2009-12-01T19:56:14.553 に答える
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"

于 2011-08-03T19:26:32.403 に答える