问题描述
我有以下带有 ActiveStorage 的模型:
class PortfolioReport < ApplicationRecord
has_many_attached :pdf_upload
validates :pdf_upload,content_type: 'application/pdf'
end
现在我想测试 ActiveStorage 是否运行良好。我定义了以下装置:
# fixtures/active_storage/attachments.yml
pdf_upload:
name: pdf_upload
record: current (PortfolioReport)
blob: pdf_upload
我尝试跟踪 this answer,但基于生成的令牌的文件位置不起作用(尝试生成校验和失败 - Errno::ENOENT: No such file or directory @ rb_sysopen
)。所以我把示例pdf文件放入fixtures/files/sample.pdf
。我最终得到了以下 blob 文件:
# fixtures/active_storage/blobs.yml
pdf_upload_blob:
key: 1234
filename: sample.pdf
content_type: application/pdf
service_name: local
byte_size: <%= File.size(Rails.root.join('test','fixtures','files','sample.pdf')) %>
checksum: <%= Digest::MD5.file(Rails.root.join('test','sample.pdf')).base64digest %>
为了测试它是否有效,我有以下 minitest 模型:
class PortfolioReportTest < ActiveSupport::TestCase
test 'pdf attached' do
pdf = portfolio_reports(:current).pdf_upload
assert pdf.attached?
assert_not_nil pdf.download
assert_equal 374,pdf.byte_size
end
end
Error:
PortfolioReportTest#test_pdf_attached:
NoMethodError: undefined method `download' for #<ActiveStorage::Attached::Many:0x00007fd5c5b87890>
test/models/portfolio_report_test.rb:16:in `block in <class:PortfolioReportTest>'
解决方法
你们有 many
关系。
如果您希望只有一个附件,请使用 has_one_attached :pdf_upload
。如果您想要多个文件,我建议为关联使用复数名称:has_many_attached :pdf_uploads
。
然后,如果您使用 many
关系,您必须告诉 ruby 您要下载哪个文件:
test 'pdf attached' do
uploads = portfolio_reports(:current).pdf_uploads
assert uploads.attached?
pdf = uploads.first
assert_not_nil pdf.download
assert_equal 374,pdf.byte_size
end