![](/img/trans.png)
[英]Rails: Testing file upload validation (Shrine gem) at model spec
[英]Shrine gem with Rails: generate versions with upload endpoint?
我将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)? 以及如何使其在直接上传后立即生成版本?
: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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.