复制图像载波

时间:2014-01-30 06:38:51

标签: ruby-on-rails-3 ruby-on-rails-3.2 carrierwave

我有ArtworkUploader,我想在同一目录中创建艺术作品图像的副本。帮我解决这个问题。

我的上传者:

class ArtworkUploader < CarrierWave::Uploader::Base
  def store_dir
    if model
      "uploads/#{model.class.to_s.underscore}/#{model.id}/#{mounted_as}"
    end
  end

  def filename
    "artwork.png"
  end
end

我尝试使用控制台,但它不起作用。我在这里缺少什么?

控制台:

> u = User.find(5)
> u.artwork.create(name: "testing.png", file: u.artwork.path)
> NoMethodError: undefined method `create!' for /uploads/5/artwork/Artwork:ArtworkUploader

1 个答案:

答案 0 :(得分:0)

有两种方法我可以想到你可以做到这一点

a) VIA版本控制:       创建文件版本

  version: copy_file do 
      process :create_a_copy
  end

现在只需在您的上传器中定义create_a_copy方法,该方法将返回相同的文件

通过这种方式,您可以获得该文件的副本。我不了解您的custom filename内容,但您已将其定义为上传者filename方法,您可以对version方法执行相同的操作{1}}以及类似的东西

   version: copy_file do 
        process :create_a_copy
        def filename
          "testing.png"
        end  
      end

注意: 我不确定版本文件的文件名东西,因为我很久以前就完成了,但我相信不同的filename方法的上述设置可行。

Adavantage:

  • 所有文件和副本都在一个上传器中关联
  • 数据库不需要额外的列(方法b中需要)

现在上面的方法也有一些注意事项

  • 稍微复杂一点
  • 单删除问题,删除原始上传者也会删除其副本

b) VIA独立专栏:    他们可以通过其他方式实现这一目标,即定义一个名为artwork_copy的单独列,并安装相同的上传器,只需略微更改您的上传器

  def filename
    if self.mounted_as == :artwork
      "artwork.png"
    else
      "testing.png"
    end
  end

您附加文件的方式(假设您的文件存储在本地)

u = User.find(5)
u.artwork_copy = File.open(u.artwork) ## Just cross check
u.save

通过以上相同的

还有另一种方法
   u = User.find(5)
   u.artwork_copy.store!(File.open(u.artwork))

现在你很清楚上面提到的方法的优点/缺点

希望这有意义