我已经尝试查看文档以查找源代码或此功能的确切描述。我目前正在使用Paperclip将文件上传到我的rails应用程序,并且如果表单在验证时失败,我会尝试保留上传的文件。
在其他代码的示例中,我看到他们在引用文件时使用此功能。 我假设这是为了检查文件是否等待上传到应用程序,但我不喜欢使用我不完全理解的功能。
感谢任何回应。
编辑*使用.staged的代码?
Class Shop < ActiveRecord::Base
attr_accessor :logo_cache
has_attached_file :logo
def cache_images
if logo.staged? # This is where I'm not exactly sure what happens
if invalid?
FileUtils.cp(logo.queued_for_write[:original].path, logo.path(:original))
@logo_cache = encrypt(logo.path(:original))
end
else
if @logo_cache.present?
File.open(decrypt(@logo_cache)) {|f| assign_attributes(logo: f)}
end
end
end
答案 0 :(得分:1)
方法是defined in lib/paperclip/attachment.rb。它表示 @queued_for_write 的属性(如果它不为空)。该属性包含一个临时文件队列,这些文件尚未写入它们应该结束的目的地。
您的代码基本上是做什么,检查上传是否尚未写入其最终目的地,如果是这种情况,请将其复制到最终目的地(Paperclip会在保存时执行此操作)。然后加密原始文件的路径(通过任何方法......)并保存在 @logo_cache 中。
如果图像没有暂存(那么某些内容已经保存,或者甚至没有上传),它会解密 @logo_cache 中的文件名,并将属性分配给原始图像(同样这是Paperclip自动)。
除此之外,如果没有适当的背景,我对这种方法并不了解。我不认为复制功能特别优雅,这是(/应该)封装在Paperclip本身。为什么该方法基于文件的当前状态进行加密和解密,并且仅在一种情况下实际更新“缓存”(无论是什么)并且仅在一种情况下更新属性,对我来说完全不知道。 / p>