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
Ruby:回形针、S3和深度克隆_Ruby_Amazon S3_Paperclip - Fatal编程技术网

Ruby:回形针、S3和深度克隆

Ruby:回形针、S3和深度克隆,ruby,amazon-s3,paperclip,Ruby,Amazon S3,Paperclip,我有一个主题模型,它包含许多资产。资产正在使用剪贴,并将其文件内容存储在AmazonAWS-S3系统中。我也在使用deep_clone,因为我的客户能够复制内置主题,然后根据自己的内心内容进行修改。所有的deep_clone都工作得很好,但是当我对资产进行deep_clone时,旧文件内容不会添加到我的S3存储桶中。记录会保存到数据库中,但由于文件内容不会使用新ID保存,因此file.url属性指向一个死文件 我试着手动调用曲别针的保存和创建方法,但我不知道如何让曲别针将文件“推”回存储桶,因为

我有一个主题模型,它包含许多资产。资产正在使用剪贴,并将其文件内容存储在AmazonAWS-S3系统中。我也在使用deep_clone,因为我的客户能够复制内置主题,然后根据自己的内心内容进行修改。所有的deep_clone都工作得很好,但是当我对资产进行deep_clone时,旧文件内容不会添加到我的S3存储桶中。记录会保存到数据库中,但由于文件内容不会使用新ID保存,因此file.url属性指向一个死文件

我试着手动调用曲别针的保存和创建方法,但我不知道如何让曲别针将文件“推”回存储桶,因为它现在有了一个新的ID,等等

require 'open-uri'

class Asset < ActiveRecord::Base
  belongs_to :theme
  attr_accessor :old_id
  has_attached_file :file,
                    :storage => "s3",
                    :s3_credentials => YAML.load_file("#{RAILS_ROOT}/config/aws.yml")[RAILS_ENV],
                    :bucket => "flavorpulse-" + RAILS_ENV,
                    :path => ":class/:id/:style.:extension"
  validates_attachment_presence :file
  validates_attachment_size :file, :less_than => 5.megabytes

  before_save :delete_assets_in_same_theme_with_same_name
  after_create :copy_from_cloned_asset

  private
  def delete_assets_in_same_theme_with_same_name
    Asset.destroy_all({:theme_id => self.theme_id, :file_file_name => self.file_file_name})
  end

  def copy_from_cloned_asset
    if (!old_id.blank?)
      if (old_id > 0)
        old_asset = Asset.find(old_id)
        if (!old_asset.blank?)
          self.file = do_download_remote_image(old_asset.file.url)
          self.file.save
        end
      end
    end
  end

  def do_download_remote_image (image_url)
    io = open(URI.parse(image_url))
    def io.original_filename; base_uri.path.split('/').last; end
    io.original_filename.blank? ? nil : io
  rescue # catch url errors with validations instead of exceptions (Errno::ENOENT, OpenURI::HTTPError, etc...)
  end
end
需要“打开uri”
类别资产“s3”,
:s3_credentials=>YAML.load_文件(“#{RAILS_ROOT}/config/aws.yml”)[RAILS_ENV],
:bucket=>flavorpulse-“+RAILS_ENV,
:path=>“:class/:id/:style.:extension”
验证附件是否存在:文件
验证附件大小:文件:小于=>5.MB
保存前:删除同名主题中的资源
创建后:从克隆的资源复制
私有的
def删除同名主题中的资源
Asset.destroy_all({:theme_id=>self.theme_id,:file_file_name=>self.file_file_name})
结束
def从克隆的资产复制
如果(!旧id为空?)
如果(旧id>0)
旧资产=资产。查找(旧资产id)
如果(!old_asset.blank?)
self.file=do_download_remote_映像(old_asset.file.url)
self.file.save
结束
结束
结束
结束
def do_下载远程图像(图像url)
io=open(URI.parse(image\uURL))
def io.original_文件名;base_uri.path.split('/').last;结束
io.original_filename.blank?零:io
rescue#使用验证而不是异常捕获url错误(Errno::enoint、OpenURI::HTTPError等)
结束
结束
有没有办法让回形针来推动文件?我也不反对使用Amazon的aws-s3 gem来实现这一点,但我似乎也无法实现这一点。

根据,使用以下简单的代码行应该是可行的:

self.file = old_asset.file