Rails file_field_tag ​​с несколькими файлами доставляет случайную строку в контроллер - PullRequest
0 голосов
/ 04 июля 2018

Я создаю форму для приема нескольких изображений. Вот форма в 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>

Я не могу понять, как правильно отформатировать / обработать image[attachment]. Видишь что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Я обнаружил, что проблема заключалась в том, что моему 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>>]
0 голосов
/ 04 июля 2018

Вы используете прямую загрузку (обратите внимание, что direct_upload: true передается file_field_tag). Когда форма отправлена, JavaScript в Active Storage загружает файл прямо в службу хранения, минуя ваше приложение. Вместо самого файла приложение получает подписанный идентификатор BLOB-объекта.

Вы можете передать этот подписанный идентификатор BLOB-объекта на attach (здесь я предполагаю, file - это имя вашего вложения):

image.file.attach(params[:image][:attachment])

… или используйте его для создания новой записи:

image = Image.new(file: params[:image][:attachment])

Active Storage использует подписанный идентификатор BLOB-объекта для поиска соответствующего BLOB-объекта и присоединения его к вашей записи.

...