Rails Paperclip конфликт между гемом aws-s3 и гемом right_aws. Как решить? - PullRequest
6 голосов
/ 11 октября 2009

для нового приложения. Я хочу использовать скрепку для хранения файлов на S3. Я уже установил гем aws-s3 для другого приложения. Это, кажется, вызывает некоторые проблемы, потому что Paperclip должен использовать right_aws, но пытается использовать драгоценный камень aws-s3. Но я не хочу удалять драгоценный камень aws-s3 из моей системы. Есть ли способ решить этот конфликт? Может быть, заставляя скрепку использовать 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 ]

12 голосов
/ 11 октября 2009

Ого, это было быстро. Я решил проблему, просто используя гем aws-s3 и изменив свой enviroment.rb на:

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

Надеюсь, это кому-нибудь поможет!

4 голосов
/ 12 августа 2011

Недавно Amazon выпустил официальный AWS SDK для Ruby . Он хорошо работает с S3, поддерживает американские, европейские и японские экземпляры S3 из коробки и хорошо поддерживается.

Я создал модуль хранения для Paperclip с именем paperclip-aws для работы с AWS SDK.

Не стесняйтесь использовать его. Я надеюсь, что это поможет.

3 голосов
/ 03 августа 2011

Основная проблема заключается в том, что 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"

3 голосов
/ 01 декабря 2009

У меня тоже была эта проблема. Задание драгоценных камней в определенном порядке, кажется, работает для некоторых людей:

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 вообще, а затем в gem backup_fu я изменил строку require, чтобы требовать right_aws, только если она еще не загружена. Я обнаружил, что, потребовав гем в environment.rb, он вызвал конфликт с гемом aws-s3. Так что теперь плагин backup_fu будет загружать его при необходимости (обычно только при запуске в качестве грабли), но не при запуске приложения.

...