Shrine gem с Rails: генерировать версии с конечной точкой загрузки? - PullRequest
0 голосов
/ 08 апреля 2019

Я использую Shrine gem с Rails 5. Я включил плагины upload_endpoint, версии, обработку и восстановление.Я ожидал получить сгенерированные версии в ответе конечной точки загрузки.

class VideoUploader < Shrine
  plugin :processing
  plugin :versions
  plugin :recache
  plugin :upload_endpoint

  plugin :upload_endpoint, rack_response: -> (uploaded_file, request) do

    # ??? I expected uploaded_file to have thumbnail version here ???

    body = { data: uploaded_file.data, url: uploaded_file.url }.to_json
    [201, { "Content-Type" => "application/json" }, [body]]
  end

  process(:recache) do |io, context|
    versions = { original: io }

    io.download do |original|
      screenshot = Tempfile.new(["screenshot", ".jpg"], binmode: true)
      movie = FFMPEG::Movie.new(original.path)
      movie.screenshot(screenshot.path)
      screenshot.open # refresh file descriptors

      versions[:thumbnail] = screenshot
    end

    versions
  end
end

Почему процесс обратного вызова процесса (: recache) происходит только при сохранении всей записи?И как заставить его генерировать версии сразу после прямой загрузки?

1 Ответ

1 голос
/ 10 апреля 2019

Действие :recache происходит только при назначении файла экземпляру модели и после успешной проверки. Так что плагин recache здесь не тот, который вам нужен.

Всякий раз, когда Shrine загружает файл, он включает параметр :action в эту загрузку, и это то, что соответствует при регистрации блока process. В настоящее время это не задокументировано, но upload_endpoint включает action: :upload, поэтому просто используйте process(:upload):

process(:upload) do |io, context|
  # ...
end

В вашем блоке :rack_response uploaded_file теперь будет хэшем загруженных файлов, поэтому вы не сможете вызвать #data для него. Но вы можете просто включить их в хеш напрямую, и они должны автоматически конвертироваться в JSON.

  plugin :upload_endpoint, rack_response: -> (uploaded_file, request) do
    body = { data: uploaded_file, url: uploaded_file[:original].url }.to_json
    [201, { "Content-Type" => "application/json" }, [body]]
  end
...