我有一个名为User
的模型。它有两个字段:small_logo
和big_logo
。
这些实际上是不同的图片,而不仅仅是一张已调整大小的图片。
class User < ActiveRecord::Base
...
mount_uploader :big_logo, UserLogoUploader
mount_uploader :small_logo, UserLogoUploader
...
end
我使用UserLogoUploader
上传这些图片。
我正在遇到一个错误 - 只要模型的名称相同,上传的文件就会获得相同的路径,所以如果我尝试上传两个名称相同的文件 - 第二个会先覆盖一个之一。
显而易见的解决方案是为这些字段使用不同的上传器。但我不想创建另一个上传器只是为了解决这个问题 - 我有什么办法可以修改文件名,例如,有一些有意义的东西,比如提交此文件的表单域名或模型的访问名称正在处理的字段。
答案 0 :(得分:2)
经过一番搜索后找到了我自己的问题的答案
上传者中有一个mounted_as
属性,对文档的反应正是我所需要的:
If a model is given as the first parameter, it will stored in the uploader, and
available throught +#model+. Likewise, mounted_as stores the name of the column
where this instance of the uploader is mounted. These values can then be used inside
your uploader.
所以整个解决方案看起来像这样:
def UserLogoUploader < CarrierWave::Uploader::Base
...
def store_dir
File.join [
Settings.carrierwave.store_dir_prefix,
model.class.to_s.underscore,
mounted_as.to_s,
model.id.to_s
].select(&:present?)
end
...
end
此代码为不同的模型字段创建不同的子文件夹,这有助于防止名称重复和文件覆盖。