Загрузить текстовый файл без выделенной модели, используя активное хранилище - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть ресурс Task, содержащий много задач. Я хочу загрузить текстовый файл, содержащий несколько задач, и импортировать их в модель задач.

Раньше я не использовал активное хранилище (AS), поэтому я просматривал документы. Я понял, что стандартным способом использования AS является создание модели записей, в которой к каждой записи прикреплен файл. В моем случае это означало бы, что я мог бы создать модель импортера и иметь одну запись для каждого действия импорта. Я чувствую, что это неправильный подход - я бы предпочел иметь действие на контроллере задач под названием импорт, который может обрабатывать загруженный файл и импортировать все записи из файла в модель задачи.

Я пытаюсь Прямая загрузка Я создал для этого форму:

<%= form_with(model: @task, action: 'start_upload', local: true) do |form| %>

  <%= form.file_field :attachments, multiple: false, direct_upload: true %>
<div class="form-group col-sm-6">
    <%= form.submit "Save",  :class => "btn btn-primary" %>
  </div>
<% end %>

Это работает каким-то образом; файл загружен - я вижу его в папке (/ Users / mhe / Documents / projects / mags / storage / 3c / jf / 3cjfvr062yd3y6wx8lly4llpdn9x). Но у меня нет возможности добраться до файла.

Вывод в журнал:

Started POST "/rails/active_storage/direct_uploads" for ::1 at 2020-04-15 22:18:04 +0200
Processing by ActiveStorage::DirectUploadsController#create as JSON
  Parameters: {"blob"=>{"filename"=>"movielist.txt", "content_type"=>"text/plain", "byte_size"=>23610, "checksum"=>"EEzCXGDVCwhcAzfHLvERaw=="}, "direct_upload"=>{"blob"=>{"filename"=>"movielist.txt", "content_type"=>"text/plain", "byte_size"=>23610, "checksum"=>"EEzCXGDVCwhcAzfHLvERaw=="}}}
   (0.1ms)  begin transaction
  ActiveStorage::Blob Create (0.4ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "byte_size", "checksum", "created_at") VALUES (?, ?, ?, ?, ?, ?)  [["key", "ge8ztddg14tapio9cw0x7lf5lu79"], ["filename", "movielist.txt"], ["content_type", "text/plain"], ["byte_size", 23610], ["checksum", "EEzCXGDVCwhcAzfHLvERaw=="], ["created_at", "2020-04-15 20:18:04.108179"]]
   (0.8ms)  commit transaction
  Disk Storage (0.3ms) Generated URL for file at key: ge8ztddg14tapio9cw0x7lf5lu79 (http://localhost:3000/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDVG9JYTJWNVNTSWhaMlU0ZW5Sa1pHY3hOSFJoY0dsdk9XTjNNSGczYkdZMWJIVTNPUVk2QmtWVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5MFpYaDBMM0JzWVdsdUJqc0dWRG9UWTI5dWRHVnVkRjlzWlc1bmRHaHBBanBjT2cxamFHVmphM04xYlVraUhVVkZla05ZUjBSV1EzZG9ZMEY2WmtoTWRrVlNZWGM5UFFZN0JsUT0iLCJleHAiOiIyMDIwLTA0LTE1VDIwOjIzOjA0LjExM1oiLCJwdXIiOiJibG9iX3Rva2VuIn19--f5314cff4278fed290a6ac3c1ee54c31542e9984)
Completed 200 OK in 19ms (Views: 0.3ms | ActiveRecord: 1.8ms | Allocations: 12779)


Started PUT "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDVG9JYTJWNVNTSWhaMlU0ZW5Sa1pHY3hOSFJoY0dsdk9XTjNNSGczYkdZMWJIVTNPUVk2QmtWVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5MFpYaDBMM0JzWVdsdUJqc0dWRG9UWTI5dWRHVnVkRjlzWlc1bmRHaHBBanBjT2cxamFHVmphM04xYlVraUhVVkZla05ZUjBSV1EzZG9ZMEY2WmtoTWRrVlNZWGM5UFFZN0JsUT0iLCJleHAiOiIyMDIwLTA0LTE1VDIwOjIzOjA0LjExM1oiLCJwdXIiOiJibG9iX3Rva2VuIn19--f5314cff4278fed290a6ac3c1ee54c31542e9984" for ::1 at 2020-04-15 22:18:04 +0200
Processing by ActiveStorage::DiskController#update as */*
  Parameters: {"encoded_token"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDVG9JYTJWNVNTSWhaMlU0ZW5Sa1pHY3hOSFJoY0dsdk9XTjNNSGczYkdZMWJIVTNPUVk2QmtWVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5MFpYaDBMM0JzWVdsdUJqc0dWRG9UWTI5dWRHVnVkRjlzWlc1bmRHaHBBanBjT2cxamFHVmphM04xYlVraUhVVkZla05ZUjBSV1EzZG9ZMEY2WmtoTWRrVlNZWGM5UFFZN0JsUT0iLCJleHAiOiIyMDIwLTA0LTE1VDIwOjIzOjA0LjExM1oiLCJwdXIiOiJibG9iX3Rva2VuIn19--f5314cff4278fed290a6ac3c1ee54c31542e9984"}
  Disk Storage (4.7ms) Uploaded file to key: ge8ztddg14tapio9cw0x7lf5lu79 (checksum: EEzCXGDVCwhcAzfHLvERaw==)
No template found for ActiveStorage::DiskController#update, rendering head :no_content
Completed 204 No Content in 6ms (ActiveRecord: 0.0ms | Allocations: 5806)


Started POST "/tasks/upload" for ::1 at 2020-04-15 22:18:04 +0200
Processing by TasksController#do_upload as HTML
  Parameters: {"authenticity_token"=>"wufWKGXHYX/obGYtKkL8SVSy5uSd/Z2XFLDxvLkDKdGQicsUPjEks9riYloTzorjhX8PgFUIj/BXV4VFi1ihKQ==", "attachments"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBEZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c47b93b4598d01bf7f9b47caa0660fd39ab9b8df", "commit"=>"Save"}
Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.0ms | Allocations: 1300)

И, таким образом, параметры, которые я получаю из формы загрузки, просто:

{"authenticity_token"=>"wufWKGXHYX/obGYtKkL8SVSy5uSd/Z2XFLDxvLkDKdGQicsUPjEks9riYloTzorjhX8PgFUIj/BXV4VFi1ihKQ==", "attachments"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBEZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--c47b93b4598d01bf7f9b47caa0660fd39ab9b8df", "commit"=>"Save", "controller"=>"tasks", "action"=>"do_upload"}

Я читал о том, как я мог бы сделать что-то вроде этого:

    blob = ActiveStorage::Blob.create_after_upload!(
      io: params[:file],
      filename: params[:file].original_filename,
      content_type: params[:file].content_type
    )

    render json: { filelink: url_for(blob) }

или

ActiveStorage::Blob.service.path_for(params['key'])

Но у меня нет ни файла, ни ключа в параметрах - Я вижу, как они выводятся в журнал.

Так что я ищу несколько советов о том, как добиться использования ... спасибо

...