我使用AmazonS3在所有非test
环境中存储Paperclip附件。
对于test
,我特意使用本地路径/网址设置来避免远程与S3交互
Paperclip::Attachment.default_options[:path] =
":rails_root/public/system/:rails_env/:class/:attachment/:id_partition/:filename"
Paperclip::Attachment.default_options[:url] =
"/system/:rails_env/:class/:attachment/:id_partition/:filename"
我在模型
中定义我的附件如下has_attached_file :source_file, use_timestamp: false
在我的生产代码中,需要使用Model.source_file.url
访问该文件,因为.url
会返回该文件的远程完全限定Amazon S3路径。这通常适用于非test
环境。
但是,在test
环境中,我无法使用.url
,因为Paperclip会在上面:path
定义的路径下创建并存储文件。所以我需要使用.path
。如果我使用.url
,我会收到错误 -
Errno::ENOENT:
No such file or directory @ rb_sysopen - /system/test/imports/source_files/000/000/030/sample.txt
这是有道理的,因为paperclip没有将文件存储在那里......
如何在test
环境中获取回形针以在:url
路径下存储/创建我的文件,以便我可以正确使用.url
?
修改:如果有帮助,请在test
中从本地存储的灯具文件创建附件
factory :import do
source_file { File.new(Rails.root + "spec/fixtures/files/sample.tsv") }
end
Edit2 :将:path
和:url
设置为初始化程序中的相同路径似乎是一个快速修复,但我正在开发更大的应用有几个贡献者,所以我没有奢侈的做法或打破任何其他人的规格。看起来像Thoughtbot自己推荐这个设置,所以应该有一个"正确的"让它按原样运作的方式。
谢谢!