You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:54:06