小编xer*_*rph的帖子

Carrierwave 预先计算文件的 md5 校验和作为文件名

使用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)

ruby-on-rails carrierwave ruby-on-rails-3.1

5
推荐指数
1
解决办法
4905
查看次数