Rails 和 Shrine 创建带有附件的模型记录
Posted
技术标签:
【中文标题】Rails 和 Shrine 创建带有附件的模型记录【英文标题】:Rails and Shrine create model record with attachment 【发布时间】:2021-08-15 17:51:42 【问题描述】:我需要使用上传器上传 Shrine 的图片,这里的示例中有默认上传器,包括一些衍生产品。
喜欢这里https://shrinerb.com/docs/getting-started
但我想在 IRB 中创建新实例,但我不知道如何正确地将图像传递给 Shrine。我将完成它,它将在脚本中用于转换一堆图像。
如果我这样做:
Images.new(
title: title,
image: File.open("image.png")
)
验证失败,因为 mime-type 为空。当我使用表单上传图片时,有一个包含完整信息的 ActionDispatch::Http::UploadedFile 对象。
请问,如何将图像传递给上传者以进行正确处理、mime 类型存储和创建衍生品?
如果我试试这个。
attacher = Shrine::Attacher.from_model(new_image, :image)
attacher.assign(image)
inside image 是图像的路径,它失败了:
*** JSON::ParserError Exception: 784: unexpected token at
如果我将 File.open(image) 传递给 assign 方法,我会得到上传的原始图像,但没有 mime 类型且没有衍生图像。
我有点困惑。
谢谢
【问题讨论】:
【参考方案1】:我有办法。
神社上传者需要一个以binmode打开的文件对象,所以
image: File.open(image, binmode: true)
在创建模型类的实例中。
【讨论】:
【参考方案2】:有时当您看到此解析错误时,这是因为记录中已包含您尝试更新的列中的一些数据。因此,它尝试将此列读取为 JSON,但由于它可能是字符串或随机字符,因此它将失败。尝试查看您的数据库中是否存在非 null 或非 JSON 值。
【讨论】:
以上是关于Rails 和 Shrine 创建带有附件的模型记录的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5 + Shrine + 多态模型 + 漂亮的位置
在使用 Shrine 和 Rails 加密之前为图像文件设置 mime 类型
Rails 6 - Shrine - ImageProcessing - 获取原始上传文件