2011-11-15 27 views
19

Tôi muốn tải hình ảnh lên máy cục bộ của mình để phát triển nhưng lưu trữ chúng trên tài khoản Amazon S3 của tôi để sản xuất.lưu trữ hình ảnh cục bộ để phát triển s3 cho sản xuất Rails Paperclip

upload.rb

if Rails.env.development? 
    has_attached_file :photo, :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>'}, 
          :convert_options => { :thumb => "-quality 92", :medium => "-quality 92", :large => "-quality 92" }, 
          :processors => [:cropper] 
else 
    has_attached_file :photo, :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>'}, 
          :convert_options => { :thumb => "-quality 92", :medium => "-quality 92", :large => "-quality 92" }, 
          :storage => :s3, 
          :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
          :path => ":attachment/:id/:style.:extension", 
          :bucket => 'birthdaywall_uploads', 
          :processors => [:cropper] 
end 

Có một số mã lặp lại ở đây. Có cách nào để viết điều này mà không cần sao chép mã.

Dưới đây là giải pháp Cảm ơn lớn thời gian để Jordan và Andrey dưới đây:

config/môi trường/development.rb

PAPERCLIP_STORAGE_OPTS = { 
    :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, 
    :convert_options => { :all => '-quality 92' }, 
    :processor  => [ :cropper ] 
    } 

config/môi trường/production.rb

PAPERCLIP_STORAGE_OPTS = { 
    :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, 
    :convert_options => { :all => '-quality 92' }, 
    :storage  => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :path   => ':attachment/:id/:style.:extension', 
    :bucket   => 'birthdaywall_uploads', 
    :processor  => [ :cropper ] 
    } 

Trả lời

13

chắc . Hãy thử một cái gì đó như thế này:

paperclip_opts = { 
    :styles => { :thumb => '40x40#', :medium => '150x200>', :large => '300x300>' }, 
    :convert_options => { :all => '-quality 92' }, 
    :processor  => [ :cropper ] 
} 

unless Rails.env.development? 
    paperclip_opts.merge! :storage  => :s3, 
         :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
         :path   => ':attachment/:id/:style.:extension', 
         :bucket   => 'birthdaywall_uploads', 
end 

has_attached_file :photo, paperclip_opts 

Ngoài rõ ràng unless/merge! khối, cũng lưu ý việc sử dụng :all cho :convert_options thay vì chỉ rõ thứ tự giống hệt nhau ba lần.

+0

Nhờ Jordan. Tôi sẽ làm như bạn đề xuất và cũng kết hợp ý tưởng ở trên để tôi có thể loại bỏ câu lệnh trừ. – chell

17

Một giải pháp nữa là di chuyển giá trị băm bằng tham số thành hằng số, sẽ được định nghĩa trong tệp config/environment/* .bb. Sau đó, bạn chỉ có thể sử dụng

has_attached_file :proto, PAPERCLIP_STORAGE_OPTS 

Sử dụng nếu/trừ trong mô hình trong khi xác định phương pháp là một chút lộn xộn Tôi nghĩ

+0

WOw đó là một ý tưởng tuyệt vời. Cảm ơn. Tôi không biết làm thế nào để trao giải này vì tôi cần phải kết hợp câu trả lời của bạn với Jordan. – chell

3

Tại sao không sửa đổi tùy chọn kẹp giấy mặc định trong production.rb?

Thêm phần này vào config/môi trường/production.rb:

Paperclip::Attachment.default_options.merge!({ 
    :storage => :s3, 
    :bucket => 'bucketname', 
    :s3_credentials => { 
    :access_key_id => ENV['S3_ACCESS_KEY'], 
    :secret_access_key => ENV['S3_SECRET_KEY'] 
    } 
}) 
Các vấn đề liên quan