Rails file_field_tag 包含多个文件,将随机字符串传递给控制器
Rails file_field_tag with multiple files delivers random string to controller
我正在构建一个表单来接受多张图片。这是 Slim
中的表单
= form_tag(product_images_path(product_id: product.id), multipart: true, remote: true) do
label Add Image
= file_field_tag(:attachment, multiple: true, name: 'image[attachment]', direct_upload: true, class: 'drop-target')
= submit_tag 'Upload'
当我测试这个表单并附加一个文件并且数据到达控制器时,附件变成了某种随机字符串,而不是我期望的 ActionDispatch::Http::UploadedFile
数组。这是在控制台中检查 params
的结果:
<ActionController::Parameters {
"utf8"=>"✓",
"authenticity_token"=>"....",
"image"=>{"attachment"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBOQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--79ca56f5342586a657d079d36e45f769dacc9356"},
"commit"=>"Upload",
"controller"=>"rics_channels/admin/images",
"action"=>"create",
"product_id"=>"5355"}
permitted: false>
我不知道如何正确 format/process image[attachment]
。看到我做错了什么吗?
您正在使用直接上传(请注意 direct_upload: true
已传递给 file_field_tag
)。提交表单后,Active Storage 的 JavaScript 将文件直接上传到您的存储服务,绕过您的应用程序。代替实际文件,应用程序收到一个签名的 blob ID。
您可以将这个已签名的 blob ID 传递给 attach
(这里我假设 file
是您的附件名称):
image.file.attach(params[:image][:attachment])
…或者用它来实例化一条新记录:
image = Image.new(file: params[:image][:attachment])
Active Storage 使用签名的 blob ID 查找相应的 blob 并将其附加到您的记录。
我发现问题是我的 file_field_tag
需要在名称中多一个 []
。
= file_field_tag('attachment[images][]', multiple: true, class: 'drop-target')
然后在控制器中:
params[:attachment][:images]
#=>[#<ActionDispatch::Http::UploadedFile:0x00007f8a70185a90
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment[images][]\"; filename=\"image1.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="image.jpg",
@tempfile=#<File:/var/folders/p6/dshxxfqj6lq83t652t6j59ym0000gn/T/RackMultipart20180703-9499-9rs1km.jpg>>,
#<ActionDispatch::Http::UploadedFile:0x00007f8a70a0bac0
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment[images][]\"; filename=\"image2.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="image2.jpg",
@tempfile=#<File:/var/folders/p6/dshxxfqj6lq83t652t6j59ym0000gn/T/RackMultipart20180703-9499-wfuqs.jpg>>,
#<ActionDispatch::Http::UploadedFile:0x00007f8a6dc82338
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment[images][]\"; filename=\"image3.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="image.jpg",
@tempfile=#<File:/var/folders/p6/dshxxfqj6lq83t652t6j59ym0000gn/T/RackMultipart20180703-9499-9oe8y4.jpg>>]
我正在构建一个表单来接受多张图片。这是 Slim
中的表单 = form_tag(product_images_path(product_id: product.id), multipart: true, remote: true) do
label Add Image
= file_field_tag(:attachment, multiple: true, name: 'image[attachment]', direct_upload: true, class: 'drop-target')
= submit_tag 'Upload'
当我测试这个表单并附加一个文件并且数据到达控制器时,附件变成了某种随机字符串,而不是我期望的 ActionDispatch::Http::UploadedFile
数组。这是在控制台中检查 params
的结果:
<ActionController::Parameters {
"utf8"=>"✓",
"authenticity_token"=>"....",
"image"=>{"attachment"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBOQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--79ca56f5342586a657d079d36e45f769dacc9356"},
"commit"=>"Upload",
"controller"=>"rics_channels/admin/images",
"action"=>"create",
"product_id"=>"5355"}
permitted: false>
我不知道如何正确 format/process image[attachment]
。看到我做错了什么吗?
您正在使用直接上传(请注意 direct_upload: true
已传递给 file_field_tag
)。提交表单后,Active Storage 的 JavaScript 将文件直接上传到您的存储服务,绕过您的应用程序。代替实际文件,应用程序收到一个签名的 blob ID。
您可以将这个已签名的 blob ID 传递给 attach
(这里我假设 file
是您的附件名称):
image.file.attach(params[:image][:attachment])
…或者用它来实例化一条新记录:
image = Image.new(file: params[:image][:attachment])
Active Storage 使用签名的 blob ID 查找相应的 blob 并将其附加到您的记录。
我发现问题是我的 file_field_tag
需要在名称中多一个 []
。
= file_field_tag('attachment[images][]', multiple: true, class: 'drop-target')
然后在控制器中:
params[:attachment][:images]
#=>[#<ActionDispatch::Http::UploadedFile:0x00007f8a70185a90
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment[images][]\"; filename=\"image1.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="image.jpg",
@tempfile=#<File:/var/folders/p6/dshxxfqj6lq83t652t6j59ym0000gn/T/RackMultipart20180703-9499-9rs1km.jpg>>,
#<ActionDispatch::Http::UploadedFile:0x00007f8a70a0bac0
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment[images][]\"; filename=\"image2.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="image2.jpg",
@tempfile=#<File:/var/folders/p6/dshxxfqj6lq83t652t6j59ym0000gn/T/RackMultipart20180703-9499-wfuqs.jpg>>,
#<ActionDispatch::Http::UploadedFile:0x00007f8a6dc82338
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"attachment[images][]\"; filename=\"image3.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="image.jpg",
@tempfile=#<File:/var/folders/p6/dshxxfqj6lq83t652t6j59ym0000gn/T/RackMultipart20180703-9499-9oe8y4.jpg>>]