【问题标题】:Shrine gem with Rails: generate versions with upload endpoint?带有 Rails 的 Shrine gem:生成带有上传端点的版本?
【发布时间】:2019-08-30 00:49:01
【问题描述】:

我在 Rails 5 中使用 Shrine gem。我启用了插件 upload_endpoint、versions、processing 和 recache。我希望在上传端点响应中获得生成的版本。

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

为什么进程回调process(:recache) 只在保存整个记录时发生?以及如何让它在直接上传后立即生成版本?

【问题讨论】:

    标签: ruby-on-rails ruby shrine


    【解决方案1】:

    :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
    

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 2018-03-04
      • 1970-01-01
      • 2023-03-25
      • 2014-07-21
      • 2014-03-07
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      相关资源
      最近更新 更多