2009-10-11 30 views
6

cho một ứng dụng mới Tôi muốn sử dụng kẹp giấy để lưu tệp vào S3. Tôi đã cài đặt đá quý aws-s3 cho một ứng dụng khác. Điều đó dường như gây ra một số vấn đề, bởi vì Paperclip nên sử dụng right_aws nhưng đang cố gắng sử dụng đá quý aws-s3. Nhưng tôi không muốn loại bỏ đá quý aws-s3 khỏi hệ thống của mình. Có cách nào để giải quyết xung đột này không? Có lẽ bằng cách buộc kẹp giấy để sử dụng right_aws? Hoặc bằng cách thay đổi cấu hình?Rails Xung đột Paperclip giữa đá quý aws-s3 và đá quý right_aws. Giải quyết thế nào?

Thiết lập của tôi

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

Cảm ơn!

Trả lời

12

Chà, thật nhanh. Tôi giải quyết vấn đề bằng cách chỉ sử dụng đá quý aws-s3 và do đó thay đổi enviroment.rb của tôi để đọc:

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

Hy vọng rằng sẽ giúp ai đó!

3

Tôi cũng gặp sự cố này. Xác định đá quý theo một thứ tự nhất định dường như làm việc cho một số người:

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

Trong ứng dụng của tôi, tôi cũng đã có một plugin (backup_fu) xác định right_aws là tốt, và tôi đã phải xóa bỏ dòng trong plugin của tôi cũng :

# 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 

Có ai biết đây là vấn đề không?

EDIT: Trong ứng dụng của tôi, tôi không còn yêu cầu right_aws nữa, và sau đó trong đá quý backup_fu tôi đã thay đổi dòng yêu cầu thành chỉ yêu cầu right_aws nếu nó chưa được tải. Tôi thấy rằng bằng cách yêu cầu đá quý trong environment.rb, nó gây ra xung đột với đá quý aws-s3. Vì vậy, bây giờ các plugin backup_fu sẽ tải nó nếu cần thiết (thường chỉ khi chạy như một nhiệm vụ rake), nhưng không phải khi ứng dụng được khởi động.

3

Vấn đề chính ở đây là aws-s3 định nghĩa lại phương thức có tên là send_request_with_body_stream.

Phiên bản aws-s3 có 4 đối số và quyền của right_http_connection có 5. Tùy thuộc vào thứ tự tải, aws-s3 có thể xác định lại phiên bản phương thức đó của right_http_connection.

Tôi nhân bản right_http_connection và thực hiện khắc phục nhanh sự cố này. Tôi đã gửi yêu cầu kéo đến right_http_connection.

Vì vậy, bạn có thể sử dụng repo git của tôi trong nhóm của mình để khắc phục vấn đề này:

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

4

Cách đây không lâu Amazon phát hành chính thức AWS SDK for Ruby. Nó hoạt động khá tốt với S3, hỗ trợ các phiên bản S3 của Mỹ, Châu Âu và Nhật Bản từ hộp và được duy trì tốt.

Tôi đã tạo mô-đun lưu trữ cho Paperclip có tên paperclip-aws để hoạt động với AWS SDK.

Hãy sử dụng nó. Tôi hy vọng nó sẽ giúp ích.

+0

Mô-đun của bạn yêu cầu Paperclip, dường như cố gắng sử dụng aws-s3. Làm thế nào tôi có thể giải quyết điều đó? – Cristian

+0

Cristian, xin lỗi vì câu trả lời quá lâu. Kẹp giấy chỉ yêu cầu 'aws-s3' để phát triển chứ không phải cho thời gian chạy.Khi bạn sử dụng 'paperclip-aws' bạn chỉ cần đưa vào Gemfile của bạn, giống như nó được hiển thị trong tài liệu và sau đó đóng gói. Không cần thêm gì nữa. –

+1

Cảm ơn bạn. Tôi đã giải quyết điều này bằng đá quý của bạn :) – Cristian

Các vấn đề liên quan