使用carrierwave上传器上传图片,尝试使用md5校验和作为文件名提供上传图片的唯一性
看起来我做错了什么
模型定义如下:
class Image < ActiveRecord::Base
attr_accessible :description, :img
mount_uploader :img, ImageUploader
Run Code Online (Sandbox Code Playgroud)
我的上传器代码如下:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"images/#{filename[0,2]}"
end
def md5
@md5 ||= ::Digest::MD5.file(current_path).hexdigest
end
def filename
@name ||= "#{md5}#{::File.extname(current_path)}" if super
end
Run Code Online (Sandbox Code Playgroud)
首先,我怀疑每次查询图像条目以显示时,这种方法都会计算校验和
其次,保存图像条目后,每隔一个img.original_filename img.filename img.path img.current_path似乎都未定义,并出现以下错误:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
app/uploaders/image_uploader.rb:17:in `store_dir'
carrierwave (0.5.7) lib/carrierwave/uploader/store.rb:43:in `store_path'
carrierwave (0.5.7) lib/carrierwave/storage/file.rb:41:in …Run Code Online (Sandbox Code Playgroud)