![](/img/trans.png)
[英]How do I create a Rails form for batch creation of records each containing an Active Storage attachment that uploads directly to S3?
[英]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.