2017-04-10 10 views
0

私はファイルを保存するためにPaperclipを使用しています。 PaperclipがAmazon S3に直接ファイルを保存するように設定しました。しかし、状況によっては、ファイルをローカルにのみ保存する必要があります。私の質問は、どうすればいいのですか?ペーパークリップ:ローカルファイルまたは実行時にS3を保存するかどうかを選択してください

Paperclip.interpolates(:upload_url) { |attachment, style| "#{ENV.fetch('UPLOAD_PROTOCOL', 'http')}://#{ENV.fetch('UPLOAD_DOMAIN', 'localhost:3000')}/uploads/:class/:attachment/:id_:style.:extension" } 

Paperclip::Attachment.default_options.merge!(
    storage: :s3, 
    s3_region: ENV['CEPH_REGION'], 
    s3_protocol: 'http', 
    s3_host_name: ENV['CEPH_HOST_NAME'], 
    s3_credentials: { 
     access_key_id: ENV['CEPH_ACCESS_KEY_ID'], 
     secret_access_key: ENV['CEPH_SECRET_KEY'], 
    }, 

    s3_options: { 
     endpoint: ENV['CEPH_END_POINT'], 
     force_path_style: true 
    }, 

    s3_permissions: 'public-read', 

    bucket: ENV['CEPH_BUCKET'], 
    url: ':s3_path_url', 
    path: ':class/:id/:basename.:extension', 

    use_timestamp: false 
) 

module Paperclip 
    def self.string_to_io(options) 
    data = StringIO.new(options[:data]) 
    data.class.class_eval{ attr_accessor :original_filename } 
    data.original_filename = options[:original_file_name] 
    data 
    end 
end 
+0

私は以下の答えを出しました。好奇心の理由から、なぜこれをやろうとしていますか? – nzajt

答えて

1

あなたは、ラムダを使用することができます。

はここに私の例のペーパークリップの構成です。ここに示すように。 https://github.com/thoughtbot/paperclip#dynamic-configuration

このようになります。

class YOURMODEL < ActiveRecord::Base 
    has_attached_file :FILE, storage: lambda { |attachment| (attachment.instance.use_s3? ? :s3 : :filesystem) } 
end 

次に、あなたがローカルまたはS3にファイルを保存したいかどうかを確認するためにあなたのモデルにメソッドuse_s3?を追加する必要があります。

+0

私は例外: 'Paperclip :: Errors :: StorageMethodNotFound'をその行で満たしています。なぜなのかご存知ですか。 –

+0

私は ':storage =>:filesystem'も試してみましたが、うまくいかないようです。 –

関連する問題