CarrierWave在单个模型中使用一次上传器两次

时间:2015-09-28 13:17:27

标签: ruby-on-rails ruby activerecord carrierwave

我有一个名为User的模型。它有两个字段:small_logobig_logo。 这些实际上是不同的图片,而不仅仅是一张已调整大小的图片。

class User < ActiveRecord::Base
  ...
    mount_uploader :big_logo, UserLogoUploader
    mount_uploader :small_logo, UserLogoUploader
  ...
end

我使用UserLogoUploader上传这些图片。

我正在遇到一个错误 - 只要模型的名称相同,上传的文件就会获得相同的路径,所以如果我尝试上传两个名称相同的文件 - 第二个会先覆盖一个之一。

显而易见的解决方案是为这些字段使用不同的上传器。但我不想创建另一个上传器只是为了解决这个问题 - 我有什么办法可以修改文件名,例如,有一些有意义的东西,比如提交此文件的表单域名或模型的访问名称正在处理的字段。

1 个答案:

答案 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

此代码为不同的模型字段创建不同的子文件夹,这有助于防止名称重复和文件覆盖。