Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 回形针:在运行时保存本地文件或S3文件之间进行选择_Ruby On Rails_Amazon S3_Paperclip - Fatal编程技术网

Ruby on rails 回形针:在运行时保存本地文件或S3文件之间进行选择

Ruby on rails 回形针:在运行时保存本地文件或S3文件之间进行选择,ruby-on-rails,amazon-s3,paperclip,Ruby On Rails,Amazon S3,Paperclip,我用回形针来保存文件。我已经成功地配置了将文件直接保存到Amazon S3的回形针。但在某些情况下,我只需要在本地保存文件。我的问题是:我如何才能做到这一点 以下是我的回形针配置示例: Paperclip.interpolates(:upload_url) { |attachment, style| "#{ENV.fetch('UPLOAD_PROTOCOL', 'http')}://#{ENV.fetch('UPLOAD_DOMAIN', 'localhost:3000')}/uploads/

我用回形针来保存文件。我已经成功地配置了将文件直接保存到Amazon 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

你可以用兰姆达。如图所示

它看起来像这样

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

然后,您必须向模型中添加一个方法
use\u s3?
,以检查您是否希望将文件存储在本地或与s3一起。

我在下面给出了一个答案,只是出于好奇,您为什么要尝试这样做?我遇到了一个例外:
回形针::错误::StorageMethodNotFound
。你知道为什么吗?我也尝试了
:storage=>:filesystem
,但它似乎不起作用。