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 - 获取原始上传文件

Shrine Gem Ruby on Rails 无服务器图像处理程序,后台作业

带有载波的 Rails 3 测试夹具?

[WesternCTF2018]shrine(SSTI+过滤)