【问题标题】:Rails Paperclip copy set of images from model A to model B从模型 A 到模型 B 的 Rails Paperclip 复制图像集
【发布时间】:2016-04-20 19:42:37
【问题描述】:

目前我有一个模型 A (ItemRequest),它有很多图像。 一旦这个项目请求被批准,它就会创建一个模型 B(项目),它也有许多图像。

我正在使用回形针处理图像上传到 S3,我想要的是在批准过程完成后,将图像从模型 A 复制到模型 B,复制它们。

以下一些类似的问题(但没有使用具有许多图像的模型)我在我的 ItemRequest 模型批准方法中编写了以下内容。

if images.length > 0
  item.images = images.map { |img| img.dup }
end

这显然会创建一组新的图像模型,但是当尝试访问 url 时,它不会打开任何图像并且 S3 返回 403。 我已经检查过,在 S3 中没有创建图像。我可以访问其他图像,以便正确配置 S3。 关于如何解决这个问题的任何想法?

def resolve! user_id
  if status != RESOLVED
    ActiveRecord::Base.transaction do
      self.resolved_by_id = user_id
      self.resolved_date  = DateTime.now
      self.status         = RESOLVED
      save!

      catalog_item = Item.create(
          name:            item_name,
          oem_name:        oem_name,
          description:     description,
          category_id:     category_id,
          make:            make,
          part_number:     part_number,
          uom:             uom,
          cost_in_cents:   cost_in_cents,
          weight_in_grams: weight_in_grams
      )
      if images.length > 0
       catalog_item.images = images.map { |img| img.dup }
       catalog_item.save
      end
    end
   end
   true
end

值得一提的是,我的 Image 模型是多态的。

我已经写了一个解决方案,但还不满意。

将此添加到图像模型中

def file_remote_url=(url_value)
  self.file = URI.parse url_value
  @file_remote_url = url_value
end

然后

catalog_item.images = images.map { |img|
  new_image = Image.new()
  new_image.file_remote_url = img.url
  new_image
}
catalog_item.save

此外,如果上传到开发机器,此解决方案在本地不起作用。

【问题讨论】:

  • 可能只是缺少项目或图像的save。你能展示整个动作吗?
  • 已更新并尝试显式调用保存。仍然是同样的问题,图像模型被创建并添加到数据库中,但图像 url 采用不存在的路径
  • catalog_item.images << images.map { |img| img.dup } 试试这个
  • 还是同样的问题。网址已更改,但图片并未真正复制到其他任何地方

标签: ruby-on-rails image amazon-s3 paperclip


【解决方案1】:

在尝试了几天不同的方法后,以下是为我解决问题的方法:

catalog_item.images = images.map do |img|
  new_image = Image.new
  new_image.imageable_type = 'CatalogItem'
  new_image.imageable_id = catalog_item.id
  new_image.file = img.file
  new_image
end

这将创建图像的副本,而不是仅更改参考。据我了解,如果您使用的是 S3 和回形针,它不会简单地使用 S3 api 复制图像,而是复制并再次上传,这可能效率有点低,但这是另一个不相关的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2014-03-22
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多