簡體   English   中英

Rails 和 Active Storage,如何在創建調用時直接分配附件?

[英]Rails and Active Storage, how to assign attachment directly on the create call?

我有MyModel

has_one_attached :video

我知道我可以這樣做:

my_model = MyModel.create!()
my_model.video.attach(io: File.open("path/my_video.webm"), filename: "video.webm")

它工作正常。

但我想知道是否有一種方法可以將附件分配到create()調用中,例如:

MyModel.create!(
  video: File.read("path/my_video.webm")
)

如果我執行上述操作,我會看到此錯誤:

/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/activesupport-6.1.4.1/lib/active_support/message_verifier.rb:176:in `verify': ActiveSupport::MessageVerifier::InvalidSignature (ActiveSupport::MessageVerifier::InvalidSignature)

我試過這個:

MyModel.create!(
  video: File.open("path/my_video.webm")
)

我收到此錯誤:

/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/activestorage-6.1.4.1/lib/active_storage/attached/changes/create_one.rb:74:in `find_or_build_blob': 找不到或構建 blob:預期可附加,得到 #File:/Users/fernando.guillen/Development/PlaycocolaBackend/test/fixtures/files/video.webm (ArgumentError)

您可以通過創建ActionDispatch::Http::UploadedFile的實例來實現。 這基本上只是一個臨時文件實例的包裝器,Rails 在處理文件上傳時在內部使用它。

MyModel.create!(
  video: ActionDispatch::Http::UploadedFile.new(
    tempfile: File.open("path/my_video.webm"), 
    filename: "video.webm",
    content_type: 'video/webm'
  )
)

在效率或 LOC 方面,與調用.attach相比,它並沒有真正的優勢。 盡管處理在 JSON 中作為 base64 編碼字符串傳遞的文件,但這是一個絕妙的技巧。

一個“真實”的用例:使用工廠創建記錄,以驗證附件在創建時的存在。

您可以為此使用Rack::Test::UploadedFile

FactoryBot.define do
  factory :my_model do
    video { Rack::Test::UploadedFile.new(Rails.root.join("path", "my_video.webm"), "video/webm") }
  end
end

你也可以MyModel.create:(video: { io. File,open('some/path'): filename. 'video.webm' })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM