我正在尝试编写一个涉及使用Carrierwave上传的文件的集成测试。我有以下配置:
CarrierWave.configure do |config|
if Rails.env.test?
config.storage = :file
config.enable_processing = false
else
# other configs
end
end
我的上传器将商店路径设置为:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
结果是文件存储在public/uploads
中。但是当我尝试通过我的模型上的doc.url
方法访问此文件时,它返回一个类似/uploads/...
的路径,并且在运行我的集成规范时,我收到以下错误:
unable to open file `/uploads/doc/paper/1/img_1.png'
我可以确认该文件确实存在于/public/uploads
目录中。如何让Carrierwave返回上传图像的正确路径?我可以将它与Rails.root.join('public', doc.url)
一起修补,但这会在我们上传到S3的生产中中断。
答案 0 :(得分:0)
经过调查后,我意识到这里的问题是我们正在尝试访问文件服务器端。客户端一切正常,因为它使用相对路径,Rails将其解析为资产路径。服务器端它不知道在哪里看。在开发和生产中我们使用S3,因此url在任何一种方式都是相同的。这感觉有点像黑客,但我们需要访问服务器上的图像,我们这样做了:
path = Rails.env.test? ? doc.img.path : doc.url
file = File.open(path)
我无法找到与环境无关的方法来解决这个问题。