我在我的工厂中使用fixture_file_upload
在使用carrierwave安装的字段中。所以,我有以下内容:
模型:
class Job < ActiveRecord::base
mount_uploader :translated_xliff, XliffUploader
end
工厂:
FactoryGirl.define do
factory :job do
translated_xliff { fixture_file_upload(
Rails.root.join(*%w[spec fixtures text.xliff])) }
end
end
这很好,但现在我在我的Job控制器上添加一个动作,让一个人下载这个文件。为此,我有以下行动:
class JobsController < ApplicationController
def xliff
job = Job.find(params[:id])
send_file(job.translated_xliff.path, disposition: 'attachment')
end
end
但这会在send_file
行引发异常:
Exception: no implicit conversion of nil into String
使用byebug
我发现path
和file
都是nil
,所以我认为工厂女孩在添加文件时失败了。
我正在使用rails 3.2和ruby 2.0。我究竟做错了什么?我应该模拟路径方法,还是以不同的方式上传文件?
答案 0 :(得分:1)
如果您使用以下内容,它会有所帮助:
job.translated_xliff.file.path
如果失败,当您在工厂中使用Rack :: Test:UploadedFile.new时会发生什么:
FactoryGirl.define do
factory :job do
translated_xliff { Rack::Test::UploadedFile.new(File.open(Rails.root.join('spec', 'fixtures', 'text.xliff')), 'application/x-xliff+xml') }
end
end
答案 1 :(得分:1)
问题是文件名错误,不是text
,而是test
。我不知道为什么,但工厂女孩并没有像往常那样抛出错误,但是这个问题超出了我的问题范围。