Rails - 上演了什么?功能呢

时间:2014-10-29 23:07:12

标签: ruby-on-rails-4 file-upload paperclip

我已经尝试查看文档以查找源代码或此功能的确切描述。我目前正在使用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

1 个答案:

答案 0 :(得分:1)

方法是defined in lib/paperclip/attachment.rb。它表示 @queued_for_write 的属性(如果它不为空)。该属性包含一个临时文件队列,这些文件尚未写入它们应该结束的目的地。

您的代码基本上是做什么,检查上传是否尚未写入其最终目的地,如果是这种情况,请将其复制到最终目的地(Paperclip会在保存时执行此操作)。然后加密原始文件的路径(通过任何方法......)并保存在 @logo_cache 中。

如果图像没有暂存(那么某些内容已经保存,或者甚至没有上传),它会解密 @logo_cache 中的文件名,并将属性分配给原始图像(同样这是Paperclip自动)。

除此之外,如果没有适当的背景,我对这种方法并不了解。我不认为复制功能特别优雅,这是(/应该)封装在Paperclip本身。为什么该方法基于文件的当前状态进行加密和解密,并且仅在一种情况下实际更新“缓存”(无论是什么)并且仅在一种情况下更新属性,对我来说完全不知道。 / p>