nee*_*zer 10 ruby-on-rails paperclip
如果用户尝试使用Paperclip将同一张照片两次上传到Rails应用程序,是否仍然会抛出验证错误?Paperclip似乎没有提供此功能......
我正在使用Rails 2.3.5和Paperclip(显然).
解决方案:(或至少其中一个)
使用Beerlington的建议,我决定使用MD5校验和比较:
class Photo < ActiveRecord::Base
#...
has_attached_file :image #, ...
before_validation_on_create :generate_md5_checksum
validate :unique_photo
#...
def generate_md5_checksum
self.md5_checksum = Digest::MD5.hexdigest(image.to_file.read)
end
def unique_photo
photo_digest = self.md5_checksum
errors.add_to_base "You have already uploaded that file!" unless User.find(self.user_id).photos.find_by_md5_checksum(photo_digest).nil?
end
# ...
end
Run Code Online (Sandbox Code Playgroud)
然后我刚刚在我的photos桌子上添加了一个专栏md5_checksum,瞧!现在,如果您尝试上传同一张照片,我的应用会抛出验证错误!
不知道这是多么高效/低效,所以重构是受欢迎的!
谢谢!
How*_*ler 10
对于任何试图这样做的人.Paperclip现在内置了md5哈希.如果你的模型中有[attachment] _fingerprint,回形针会用MD5填充它.
由于我已经有一个名为hash_value的列,因此我创建了一个名为fingerprint的"虚拟"属性
#Virtual attribute to have paperclip generate the md5
def picture_fingerprint
self.hash_value
end
def picture_fingerprint=(md5Hash)
self.hash_value=md5Hash
end
Run Code Online (Sandbox Code Playgroud)
而且,使用rails3,使用sexy_validations,我可以简单地将它添加到我的模型的顶部,以确保hash_value在保存模型之前是唯一的:
validates :hash_value, :uniqueness => { :message => "Image has already been uploaded." }
Run Code Online (Sandbox Code Playgroud)