微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rails Minitest:ActiveStorage NoMethodError:未定义的方法`download'

如何解决Rails Minitest:ActiveStorage NoMethodError:未定义的方法`download'

我有以下带有 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。