【问题标题】:Rails Paperclip conflict between aws-s3 gem and right_aws gem. How to solve?aws-s3 gem 和 right_aws gem 之间的 Rails Paperclip 冲突。怎么解决?
【发布时间】:2010-12-05 18:16:59
【问题描述】:

对于一个新应用程序,我想使用回形针将文件存储到 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'
...

谢谢!

【问题讨论】:

    标签: ruby-on-rails amazon-s3 paperclip right-aws


    【解决方案1】:

    哇,真快。我通过使用 aws-s3 gem 解决了这个问题,因此将我的 enviroment.rb 更改为:

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

    希望对某人有所帮助!

    【讨论】:

      【解决方案2】:

      不久前亚马逊发布了官方AWS SDK for Ruby。它与 S3 配合得很好,支持美国、欧洲和日本的 S3 实例,并且维护良好。

      我为 Paperclip 创建了一个名为 paperclip-aws 的存储模块,以便与 AWS SDK 配合使用。

      请随意使用。我希望它会有所帮助。

      【讨论】:

      • 您的模块需要回形针,它似乎尝试使用 aws-s3。我该如何解决?
      • 克里斯蒂安,请原谅我这么长的回答。 Paperclip 需要 aws-s3 仅用于开发,而不是运行时。当您使用paperclip-aws 时,您只需将其包含在您的 Gemfile 中,就像文档中显示的那样,然后捆绑。不需要更多。
      • 太棒了!真的很高兴,它可以帮助你。
      【解决方案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 任务运行时),但不会在应用程序启动时加载。

      【讨论】:

        【解决方案4】:

        这里的主要问题是 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 =&gt; "git://github.com/gammons/right_http_connection"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          • 2012-03-29
          • 2015-02-13
          • 2011-11-15
          • 2013-09-03
          • 1970-01-01
          相关资源
          最近更新 更多