我有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
答案 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) 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))
现在你很清楚上面提到的方法的优点/缺点
希望这有意义