0

我正在使用 CarrierWave 将图像保存到 S3。在上传之前,图像被重命名为随机字符串。现在为了更快地查找,我想将文件放在以文件名的前两个字母命名的目录中。但是这样做,Rails 中止了stack level too deep.

所以我假设调用#{model.image[0, 2]会导致无限递归。有没有办法将文件名作为字符串访问?或者更简单的解决方案?

这是上传者:

class ImageUploader < CarrierWave::Uploader::Base

  storage :fog

  def store_dir
    "images/#{model.image[0, 2]}/"
  end

  def filename
    "#{secure_token}.#{file.extension}" if original_filename.present?
  end

  protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(8))
  end

end
4

2 回答 2

1

试试:file_identifier方法

class ImageUploader < CarrierWave::Uploader::Base
  ...

  def store_dir
    "images/#{model.file_identifier[0, 2]}/#{model.id}"
  end

  ...

end
于 2015-04-14T05:28:19.897 回答
0

简单的答案是filenameImage模型中添加一个代理属性,并使用read_attribute

class Image < ApplicationRecord
  mount_uploader :image, ImageUploader

  def filename
    read_attribute(:image)
  end
  ...
end

然后在您ImageUploader#store_dir method参考代理属性filename

  def store_dir
    "images/#{model.filename}"
  end

这对我有用并消除了递归错误问题。

于 2017-12-03T15:53:29.473 回答