Rails 6使用Shrine插件生成PDF缩略图后URL异常无法显示问题
你遇到的问题根源是插件冲突、未主动触发衍生物持久化、调用方法不匹配三个原因共同导致的,对应解决步骤如下:
1. 清理冲突插件
Shrine 3+ 中 versions 是已废弃的旧版多版本插件,和你使用的新版 derivatives 插件功能冲突,同时processing插件也不需要和derivatives混用,先修改Uploader配置:
require "image_processing/mini_magick" class FileUploader < Shrine include ImageProcessing::MiniMagick # 删除以下两行冲突配置 # plugin :processing # plugin :versions plugin :derivatives plugin :default_url Attacher.validate do validate_max_size 5*1024*1024, message: "is too large (max is 5 MB)" validate_mime_type %w[application/pdf] end # 新增自动生成衍生物的回调,上传完成后自动执行缩略图生成并写入数据库 Attacher.after_promote :create_derivatives Attacher.derivatives do |original| magick = ImageProcessing::MiniMagick.source(original).loader(page:0).convert("jpeg") { thumb: magick.resize_to_limit!(200, 200) } end end
2. 修改视图调用方法
file_url(:thumb)是旧版versions插件的调用方式,derivatives插件需要通过衍生物节点拿路径,修改视图代码:
<p> <strong>Issue Thumbnail:</strong> <!-- 新增衍生物存在判断,避免空值报错 --> <%= image_tag @issue.file.derivatives[:thumb].url if @issue.file&.derivatives&.key?(:thumb) %> </p>
3. 验证效果
修改完成后重新上传PDF,查看数据库file_data字段会新增derivatives节点存储缩略图信息,此时视图即可正常渲染缩略图。
如果需要给历史已上传的PDF补生成缩略图,可在Rails控制台执行以下命令:
Issue.find_each do |issue| next unless issue.file.present? issue.file_attachment.create_derivatives issue.save! end
内容的提问来源于stack exchange,提问作者user1851592
相关产品推荐
相关产品推荐

